【QuickTips 03】GASでスプレッドシートの 起点(左上)セルだけA1指定して動的データをsetValuesする方法
シンプルでちょっと便利な Quick Tipsです。マガジンにまとめていきます。
GASのgetRange() の2つの引数指定方法

GAS(Google Apps Script)でGoogleスプレッドシートの指定したセル(セル範囲)を取得するメソッドが getRange( ) です。
getRange( ) の引数記述(セルの指定)方法は大きく2つあって、

■行・列番号指定
getRange(5,3,3,2)
5行3列目のセル(C5)を起点として、そこから3行2列分の範囲と指定
■A1表記指定
getRange('C5:D7')
A1表記のセル範囲 C5:D7 を文字列で指定
それぞれ利点があるので、状況によって使い分けができると便利です。

getRange() で Rangeオブジェクト を取得すれば、 getValeus( )で値を取得したり、setValues( ) で値を書き込んだり と様々な処理が可能になります。
setValues() の注意点
セル範囲に値を書き込む setValues() を使う時は、
書き込むデータは二次元配列
書き込み先のセル範囲はデータと同じサイズ
に注意が必要です。

だから 手動コピペのように

起点(左上)だけ指定してsetValues することは出来ません。

setValues() の 書き方の型
書き込むデータと同じサイズを getRangeで取得する際は、A1表記ではなく、行・列番号指定を利用するのが一般的です。

これは決まった型があるので覚えちゃいましょう。
sheet の C5セル(5行、3列)を起点に array という二次元配列を setValuesしたい時は、lengthプロパティで 要素数を取得して
sheet.getRange(5,3,array.length,array[0].length).setValues(array);このように書きます。
でも、これってパッと見でどのセルが起点かわかりにくいんですよね。
offset() メソッドで、いいとこどりでセル範囲指定
起点となるセルは 人がわかりやすい A1表記、範囲の行数や列数は数値指定とする書き方が出来ないか?
このいいとこどりを実現する Tipsが offset() メソッドです。
offset(オフセット行, オフセット列, 行数, 列数)
シート関数の OFFSETと同じ感覚で使えます。
これを使って

まず単体セルを getRange(targetCell)で取得、オフセット(ずらし)は無しでサイズだけarrayに合わせたいので、
sheet.getRange(targetCell).offset(0,0,array.length,array[0].length).setValues(array)と記述することで、起点となる左上のセルをA1表記の文字列で指定するだけで、簡単に二次元配列をsetValuesできるようになります。
ユーザーに貼付け先を後で変更してもらう場合も、これなら簡単ですね!
onEditと組み合わせて超絶便利
offsetは 編集時トリガーの onEdit(e)と組み合わせても超絶便利です。

編集したセルの右に自動でタイムスタンプを入れたい!なんて時も、
e.range.offset( 0, 1 )
で一発で取得できます。
今回のQucik Tipsの関連 note
GAS活用のnoteをマガジンにまとめています 👇
いいなと思ったら応援しよう!
チップ大歓迎です。やる気がアップしますw