見出し画像

【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 を文字列で指定

※R1C1表記で記述も可


それぞれ利点があるので、状況によって使い分けができると便利です。


getRange() で Rangeオブジェクト を取得すれば、 getValeus( )で値を取得したり、setValues( ) で値を書き込んだり と様々な処理が可能になります。



setValues() の注意点

セル範囲に値を書き込む setValues() を使う時は、

  1. 書き込むデータは二次元配列

  2. 書き込み先のセル範囲はデータと同じサイズ

に注意が必要です。

二次元配列は 行(縦)配列の中に列(横)配列があるイメージ

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

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

データは3行だけど取得したセル範囲は1行というメッセージが



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をマガジンにまとめています 👇


いいなと思ったら応援しよう!

mir チップ大歓迎です。やる気がアップしますw