3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【GoogleAppScript/SpreadSheet】R1C1方式でgetRange/getRangeListする方法

Last updated at Posted at 2021-11-03

##動機
特定のSheetの条件に合うセルに背景色/文字色変更などの操作を行う場合、それぞれのセルについてgetRange()しないと行けないが、都度APIにアクセスしないといけないため動作が重くなる。
 ⇒じゃあgetDataRange().getValues()で一旦データを拾った後、条件にあう範囲を配列で拾って、getRangeList().setFontColor()等を使ったら、軽いのでは?
 ⇒リファレンス見たけどどうやってR1C1形式でgetRangeListしたらいいかわからん・・・・
ということで調べてみました。

<公式リファレンス>
image.png

インターネット漁って見ても、**sheet.getRangeList(['A1', 'B1', 'C1'])と、範囲ベタ打ちの物しかなく、変数を使ってR1C1方式で範囲を取得する方法がなかったので、下記忘備録として記載します。
また、getRangeには
getRange({行番号},{列番号},{行数},{列数})**と記述すれば”ある連続した範囲”は取得出来るため、そんなに必要性は感じませんが、R1C1でrangeを取得する方法が乏しかったので、こちらも参考として記載します。

##R1C1方式でgetRangeList

getRangeList.gs
 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()

getRange.gs
 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するなりすると思うからそこまで需要ないよなと言う感じ!

まぁええわ、ほな!

##参考
=後で記載します=

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?