メインコンテンツへスキップ
見出し画像

【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

     
     
    元Excel職人・VBA使いから、Googleスプレッドシート職人・GAS使いにジョブチェンジ。謎解き感覚で お題(課題)を解決していくような記事を書こうかなと。その他、AIやらGeminiやらGoogleWorkspaceネタ全般

    あなたへのおすすめ