フィルタリングするスクリプトを教えて下さい。

1,773 views
Skip to first unread message

Mayu Koizumi Toyokawa

unread,
Oct 2, 2016, 1:34:21 AM10/2/16
to Google Apps API Japan


共有のスプレッドシートでスクリプトを組んで作業効率を上げたいと思っていますが、

初心者のため分からず、お伺いさせてください。

スクリプトエディタは開けます。その中にどのような記述をすればいいのでしょうか?


前提として、シートの3行目にオートフィルタがかかっています。

<やりたいこと>
【1】E3のセルで「作業中」のみにデータをフィルタリングする

【2】3行目にかかっているすべてのフィルタをクリアにする(フィルタの機能は残しつつ、データを全表示にする)

【3】特定の列の最後の行を表示する


それぞれのスクリプトを作り、作業の効率化を目指したいと思ています。
初心者で調べても分からずお伺いしました。言葉なども間違っていたらすみません。。

宜しくお願いします。

松本裕史

unread,
Oct 3, 2016, 1:18:31 AM10/3/16
to Google Apps API Japan
Filterの操作は分からないのですが、こんな感じはどうですか?ざっと作ったので言われた通りの事しか出来ませんが。。
3は意味がよくわからなかったので、やってないです。


function filter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  
  //最終行を取得
  var lastRow = sheet.getLastRow();
  
  //セルの値を取得
  var range = sheet.getRange("A4:G" + lastRow).getValues();
  var re = new RegExp("作業中");
  
  for (var i = 0; i <= lastRow - 4; i++){
    //C列の値が「作業中」だったら非表示
    if (range[i][2].match(re)){
      sheet.hideRows(i + 4);
    }
  }
}

function clear(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  var lastRow = sheet.getLastRow();
  
  for (var i = 0; i <= lastRow - 4; i++){
    //無条件に表示
    sheet.showRows(i + 4);
  }
}






2016年10月2日日曜日 14時34分21秒 UTC+9 Mayu Koizumi Toyokawa:

Mayu Koizumi Toyokawa

unread,
Oct 5, 2016, 10:13:06 PM10/5/16
to Google Apps API Japan
松本さん

ご丁寧にありがとうございます。
入れてみたのですが、「TypeError: オブジェクト 252 で関数 match が見つかりません」とエラーが出てしまいました。。。
修正箇所が分からずにおります。

なお、シート名を変更しているのですが、
その場合は "シート1" を該当の名前にすればよいのでしょうか?

お手数おかけしてすみません。

小泉


2016年10月2日日曜日 14時34分21秒 UTC+9 Mayu Koizumi Toyokawa:

松本裕史

unread,
Oct 6, 2016, 12:38:58 AM10/6/16
to Google Apps API Japan
おっしゃる通り、シート名を変えてたら"シート1"を変えたらいいです。

そのエラーは252行目のとこに数字?とかが入ってるからエラーになっていると思いますので、文字列かどうか判定した方がよいですね。
こんな感じで動くかと思います。

function filter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  
  //最終行を取得
  var lastRow = sheet.getLastRow();
  
  //セルの値を取得
  var range = sheet.getRange("A4:G" + lastRow).getValues();
  var re = new RegExp("作業中");
  
  for (var i = 0; i <= lastRow - 4; i++){
    //C列の値が「作業中」だったら非表示
    if (is("String", range[i][2]) && range[i][2].match(re)){
      sheet.hideRows(i + 4);
    }
  }
}

function clear(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  var lastRow = sheet.getLastRow();
  
  for (var i = 0; i <= lastRow - 4; i++){
    //無条件に表示
    sheet.showRows(i + 4);
  }
}

/******************************************
** オブジェクト型の型判定
*******************************************/
function is(type, obj) {
  var clas = Object.prototype.toString.call(obj).slice(8, -1);
  return obj !== undefined && obj !== null && clas === type;
}



2016年10月6日木曜日 11時13分06秒 UTC+9 Mayu Koizumi Toyokawa:

Mayu Koizumi Toyokawa

unread,
Oct 8, 2016, 2:08:11 PM10/8/16
to Google Apps API Japan
松本さん

ありがとうございます! そして、度々すみません。。。
教えて頂いたものを入れてみたところ、エラーは出なかったのですが、動きませんでした。。

一つ気になっているのは、E列にソートしたいデータが入っているのですが、
作って頂いたものに「C列の値が「作業中」だったら非表示」とありましたので、数値が少しずれてしまったのでしょうか。

そして、教えていただいたものすべてを、
1つのスクリプトファイルに貼り付けるべきでしょうか?
function ~の個所で2つに分けるのかな?とも思いましたが、勉強不足ですみません。


お手数おかけしてすみません。
宜しくお願いします。

2016年10月6日木曜日 13時38分58秒 UTC+9 松本裕史:

松本裕史

unread,
Oct 9, 2016, 1:02:37 AM10/9/16
to Google Apps API Japan

すみません。
CをEに変える必要がありますね。。。Cと勘違いしてました。
1つのファイルに書いて問題ないですよ

Mayu Koizumi Toyokawa

unread,
Oct 17, 2016, 2:18:07 AM10/17/16
to Google Apps API Japan
松本さん

色々試してみたのですが、どうしても実行できない状況におります^^;
かつファイルが重くなってきてしまったので、実行させたいことを1つにしたいと思いました。
「3行目にかかっているオートフィルタをリセットする(オートフィルタの三角ボタンは残しつつ、フィルタがかかっていたデータを全表示にする)」

その場合、スクリプトは下記になるのでしょうか?
これもまた動かず、フィルタリングデータは、スクリプト実行後も変わらずです・・・

function clear(){
  var ss = SpreadsheetApp.getActiveSpreadsheet("スプレッドシートの名前を入れる");
  var sheet = ss.getSheetByName("シートの名前を入れる");
  var lastRow = sheet.getLastRow();
  
  for (var i = 0; i <= lastRow - 4; i++){
    //無条件に表示
    sheet.showRows(i + 4);
  }
}



何度もお手数おかけして申し訳ありませんが、
調べても分からずにおります><
宜しくお願いいたします。

小泉

Mayu Koizumi Toyokawa

unread,
Oct 17, 2016, 2:35:29 AM10/17/16
to Google Apps API Japan
すみません、ここの意味を教えて頂けませんか?

  for (var i = 0; i <= lastRow - 4; i++){

こいずみ


2016年10月17日月曜日 15時18分07秒 UTC+9 Mayu Koizumi Toyokawa:

松本裕史

unread,
Oct 18, 2016, 2:31:09 AM10/18/16
to Google Apps API Japan
function clear(){
  var ss = SpreadsheetApp.getActiveSpreadsheet("スプレッドシートの名前を入れる");
  var sheet = ss.getSheetByName("シートの名前を入れる");
  var lastRow = sheet.getLastRow();
  
  for (var i = 0; i <= lastRow - 4; i++){
    //無条件に表示
    sheet.showRows(i + 4);
  }
}

これの

var ss = SpreadsheetApp.getActiveSpreadsheet("スプレッドシートの名前を入れる");

はスプレッドシートの名前は入れません!w
意味はssという変数にアクティブ(今開いてる)スプレッドシートのオブジェクトを入れるって事なので、名前は不要です。

 for (var i = 0; i <= lastRow - 4; i++){

はiという変数をまず0とします。
forの{から}までの処理をiがlastRowから4引いた数になるまで繰り返して行うという意味なので、ここでいうと

lastRowはデータが入ってる最終行です。
4行目からデータは入っているわけなのでiが0だったとするとlastRowは最終行から-4引いた数が最終行になります。
ここでなぜiを0にしているかというと、rangeは配列なので0からスタートします。
i=0 の時にrange[0]の値を見たいので配列に合わせてます。こうすればrangeに入ってるデータ(最終行までのデータ)を全て見る事が出来ます。

range[0]の値が文字列で且つ「作業中」かどうかをチェックし、当てはまっていたら0+4(すなわち4行目)を表示・非表示します。
range[1]の値が文字列で且つ「作業中」かどうかをチェックし、当てはまっていたら1+4(すなわち5行目)を表示・非表示します。
次にrange[2]の値が文字列で且つ「作業中」かどうかをチェックし、当てはまっていたら2+4(6行目)を表示・非表示します。
・・・
っていう感じですが、、、わかりましたでしょうか。。。

ちなみに「C」を「E」に変えるのは
range[i][2] を range[i][4]に変えれば良いです。
下記。

function filter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  
  //最終行を取得
  var lastRow = sheet.getLastRow();
  
  //セルの値を取得
  var range = sheet.getRange("A4:G" + lastRow).getValues();
  var re = new RegExp("作業中");
  
  for (var i = 0; i <= lastRow - 4; i++){
    //C列の値が「作業中」だったら非表示
    if (is("String", range[i][4]) && range[i][4].match(re)){
      sheet.hideRows(i + 4);
    }
  }
}

function clear(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  var lastRow = sheet.getLastRow();
  
  for (var i = 0; i <= lastRow - 4; i++){
    //無条件に表示
    sheet.showRows(i + 4);
  }
}

/******************************************
** オブジェクト型の型判定
*******************************************/
function is(type, obj) {
  var clas = Object.prototype.toString.call(obj).slice(8, -1);
  return obj !== undefined && obj !== null && clas === type;
}

2016年10月17日月曜日 15時35分29秒 UTC+9 Mayu Koizumi Toyokawa:

Mayu Koizumi Toyokawa

unread,
Oct 18, 2016, 1:12:01 PM10/18/16
to Google Apps API Japan
松本さん

分かりやすい説明をありがとうございました!
ご丁寧に本当にありがとうございます。

ようやく意味がわかり、スクリプトでデータを動かすこともできました。
行ごと非表示/表示にする仕組みになっていたのですね!

私は、3行目に付けたフィルタを使ってデータをソート表示していたので、
clearスクリプトを実行させても思うように動かなかったようです。
教えて頂いたスクリプトを使ってなんとかファイルを活用できないか考えてみます!


ファイルは複数の人が使っていて、3行目のフィルタも使用しているため、
どこかしらの項目でソートがされている可能性があるのです。
スプレッドシート上で「フィルタのデータを全表示」のようなボタンが見当たらず、フィルタを付けるか外すかの2択のようなので(私が知らないだけかもしれませんが^^;)、一発でデータを全表示できるような機能を探していました。

スクリプトを使って、3行目のフィルタを操作することは難しいのでしょうか?
「値でフィルタ」の「すべて選択」を押した状態にするなど・・・

小泉



2016年10月18日火曜日 15時31分09秒 UTC+9 松本裕史:
Reply all
Reply to author
Forward
0 new messages