どうも。つじけ(tsujikenzo)です。このシリーズではVBAの「RangeオブジェクトのRangeプロパティ」がGoogle Apps Scriptの「Rangeオブジェクト」とどう違うのかについて【前編・中編・後編】で書き留めていきたいと思います。今日は【中編】です。VBA猛者の方々にガブガブ食べられるのを恐れています💦
前回のおさらい
前回はVBAのRangeクラスについて、Rangeオブジェクトをオブジェクト変数として代入したり、Valuesプロパティで値の取得と設定を学びました。
今日はGASで同じことをやりたいと思います。
GASのRangeクラスとは
ノンプロ研GAS初級講座7期のDay5でお伝えした通り、RangeクラスはGoogle Workspace Serviciesの[SpreadSheetサービス]に所属しており、使う時は[SpreadSheetApp]クラスから順番に[SpreadSheet]→[Sheet]→[Range]のように、マトリョーシカのように親から子へ続く階層構造で取り扱います。
公式リファレンス
公式リファレンスも確認しておきましょう。
スプレッドシートの範囲にアクセスして変更します。範囲は、シート内の単一のセルまたはシート内の隣接するセルのグループです。
となっております。Rangesというクラスは無く、複数のセル範囲もRangeクラスで操作ができるようです。
また、Rangeクラスのメンバーはメソッドのみで、状態を表すプロパティや定数などは用意されていないようです。
代表的なメソッド
clearContent()
getA1Notation()
getValue(), getValues()
setValue(), setValues()
setBorder()
セルの値を取得、設定する
実際にセルに書かれている値を取得して確認したり、好きな値をセルに設定したりしてみましょう。コンテナバインドのSheet1にこのような値を用意しました。
値の取得や設定は問題ないと思います。
console.log(SpreadsheetApp.getActiveSheet().getRange('A1').getValue()); //A1です
SpreadsheetApp.getActiveSheet().getRange('A1').setValue('A1たい');
console.log(SpreadsheetApp.getActiveSheet().getRange('A1').getValue()); //A1たい
変数に代入
何度も繰り返し記述しているコード変数に代入してスッキリしましょう。GAS(JavaScript)は型の宣言をしなくても何でも変数に代入できるのが特徴的です。繰り返し登場するこの一文SpreadsheetApp.getActiveSheet().getRange(‘A1’)は中身はRangeオブジェクトです。分かりやすい変数を付けるのも上達のポイントです。
const rangeA1 = SpreadsheetApp.getActiveSheet().getRange('A1');
console.log(rangeA1.getValue()); //A1たい
rangeA1.setValue('A1です');
console.log(SpreadsheetApp.getActiveSheet().getRange('A1').getValue()); //A1です
console.log(rangeA1.getValue()); //A1です
最後の2行は同じことをしていますが、あえて並べて記述してみました。いかがでしょうか。rangeA1というRangeオブジェクトに対して、値の取得ならgetValue()、値の設定ならsetValue()という2つのメソッドで操作しました。
SpreadsheetApp API
GASでSpreadsheetAppなどのトップレベルオブジェクトを叩いた時に、下記のような承認を求められることがありますよね?
ドメインユーザー
gmail.comユーザー
自分で作成したスプレッドシートとスクリプトなのに、なぜ本人確認のようなものを求められるかと言うと、Google Workspace Servicesのトップレベルオブジェクト(SpreadsheetApp)を叩くということは、Google Workspace ServicesのAPIを叩くという作業そのものだからです。
APIとは
APIはインターネット上のアプリケーションにある問い合わせ窓口のようなもので、アプリケーションに命令を出す人とやり取りをする為に用意されている「アプリケーションプログラミングインタフェース」の略です。
スプレッドシートが発表された際、我々は「MicrosoftのExcelをネット上で使えるんだね」とばかり思って感動していました。しかし本質は「スプレッドシート(インターネット上のアプリケーション)にAPIを装備したからプログラミングで動かせるよ」というのがGoogle Apps Scriptの衝撃でございました(2015年8月のリリースです)。
Spreadsheet APIを叩く
少し脱線してしまいましたが、コンテナバインドスクリプトを作成して下記を実行すると、
console.log(SpreadsheetApp.getActiveSheet().getRange('A1').getValue());
SpreadsheetApp APIをコンコン(ノックするイメージ)と叩いて、SpreadSheetさんからは「お宅、どちら様?」と身分証明を求められ、「つじけです。てへ。」という作業が初回のみ必要なのです。一度認証を通してしまえば常連さんとして覚えてもらえますので、都度認証はありませんが、SpreadsheetAppにぶら下がっているクラスのメンバーを実行すると言うのはSpreadsheetApp APIを叩くことですから、なるべくサーバーには負担を掛けないように、APIを叩く回数は減らした方がいい(配列で取得するなど)というお話です。
このようにGASがVBAとExcelのように処理が早くないのは、毎回サーバーと通信してSpreadSheetを操作している為です。
まとめ
以上で、「GASでスプレッドシートのセルの値を取得、設定するには?」をお届けしました。GASでスプレッドシートを操作すると言うのは、都度SpreadsheetApp APIを叩いているというお話にまで発展しました。
次回は最終回です。VBAとGASのRangeクラスについて比較をまとめたいと思います。