##動機
特定のSheetの条件に合うセルに背景色/文字色変更などの操作を行う場合、それぞれのセルについてgetRange()しないと行けないが、都度APIにアクセスしないといけないため動作が重くなる。
⇒じゃあgetDataRange().getValues()で一旦データを拾った後、条件にあう範囲を配列で拾って、getRangeList().setFontColor()等を使ったら、軽いのでは?
⇒リファレンス見たけどどうやってR1C1形式でgetRangeListしたらいいかわからん・・・・
ということで調べてみました。
インターネット漁って見ても、**sheet.getRangeList(['A1', 'B1', 'C1'])と、範囲ベタ打ちの物しかなく、変数を使ってR1C1方式で範囲を取得する方法がなかったので、下記忘備録として記載します。
また、getRangeにはgetRange({行番号},{列番号},{行数},{列数})**と記述すれば”ある連続した範囲”は取得出来るため、そんなに必要性は感じませんが、R1C1でrangeを取得する方法が乏しかったので、こちらも参考として記載します。
##R1C1方式でgetRangeList
let ss =SpreadsheetApp.getActiveSpreadsheet();
let sh =ss.getActiveSheet()//アクティブシート取得
//*セル番地のリストをベタ打ちで取得する場合
let r1c1LocationList =["R1C1","R2C2","R3C3:R4:C4"]
let range = sh.getRangeList(r1c1LocationList);
//=>getRangeListの返り値はRangeオブジェクトではないので、更にgetRanges()する必要がある
let rangeList = range.getRanges();
//=>r1c1LocationListの配列のアドレスにあるrangeオブジェクトが配列で返ってくる
//*変数を使って複数セル範囲を取得する例
r1c1LocationList =[]
for(let i=0;i<6;i++){
r1c1Location.push(`R${i}C${i}`);
}
range = sh.getRangeList(r1c1LocationList);
rangeList = range.getRanges();
//=>A1,B2,C3,D4,E5のRangeオブジェクトが配列で返る
ポイントとしてはgetRangeListの返り値はRangeオブジェクトの配列ではなくRangeListオブジェクトなので、更にgetRanges()をして、Rangeオブジェクトの配列に戻さないとsetValueとかgetValueは出来ないよって事です。まぁあまりすることないと思うけど・・・
##R1C1方式でgetRange()
let ss =SpreadsheetApp.getActiveSpreadsheet();
let sh =ss.getActiveSheet()//アクティブシート取得
//*ベタ打ちでA1を取得する場合
let range = sh.getRange('R1C1');
//*変数を使ってセル範囲を取得する場合
let startRow=1;let startColumn=1
let endRow=1;let endColumn=1
let r1c1Location=`R${startRow}C${startColumn}:R${endRow}C${endColumn}` ;//=> r1c1Location="R1C1:R1C1"と同じ
range = sh.getRange(r1c1Location);//"R1C1:R1C1"="A1"のRangeオブジェクトを取得
ここまで書いて思ったけど、大体聡明な方なら、getDataRange().getValues()してから2次元配列をmapなりfilterするなりすると思うからそこまで需要ないよなと言う感じ!
まぁええわ、ほな!
##参考
=後で記載します=