Google Apps Script(GAS)は便利な反面、Google Workspace(G Suite)特有の注意点が多かったりします。
コーディングだけだと気づきづらいポイントも多々あり、実務として取り組む中で詰まることが多かったポイントについて、個人用の備忘録としてまとめてみました。
権限が適切ではない
スプレッドシートやカレンダー、ドライブなどのサービスをGASで操作する、ということはユースケースとして多く発生すると思いますが
権限がなく、エラーになってしまう場合があります。
よくあるのが、トリガーの権限が適切に設定されていないケースです。
管理者と開発者が分離している場合だと、トリガーは管理者が設定するケースもありますので
「管理者が必要なリソースに対して、適切な権限を持っているか」というポイントは、しっかりと考慮して設計し
必要があればマニュアルを作成して手順を共有する必要があります。
権限エラーが発生しやすいポイント
- ファイルの編集権限がない
- カレンダーの閲覧権限がない
- ドライブ・フォルダの編集権限がない
ファイル編集権限がない
スクリプトを実行するユーザーが、スプレッドシートなどのファイルに対して権限がない場合に発生します。
カレンダーの閲覧権限がない
Google Calendarの情報を取得するためには、**「実行するユーザーがカレンダーを表示できるようにする」**必要があります。
例えば、管理者のカレンダーをGASプロジェクトの中で取得するためには、下記のうちいずれかの条件を満たす必要があります。
- 管理者がスクリプトを実行する
- 管理者権限でトリガーを設定し、トリガー経由でスクリプトを実行
また、管理者のカレンダーを開発者に共有された場合は、下記の条件でも取得可能です。
- 開発者がスクリプトを実行する
- 開発者権限でトリガーを設定し、トリガー経由でスクリプトを実行
範囲指定にマジックナンバーを使用している
マジックナンバー(英:magic number)とは、人間語で書いたプログラムの元ネタ(ソースコード)の中に
直接埋め込まれた何らかの意味を持つ値のこと
(引用元:https://wa3.i-3-i.info/word12868.html)
GASでスプレッドシートを使用している方であれば、getRange
というメソッドを使用したことがあるかと思います。
スプレッドシートの範囲取得getValues
や、スプレッドシートに値を入力するsetValues
などの前提として使用する範囲指定ですが
引数で使用する開始セル、範囲指定などでマジックナンバーを使用すると
スプレッドシートの構造を変える時に、後々マジックナンバーの値をすべて変える必要があるので
メンテナンスがだいぶやりづらくなります。
// マジックナンバーを使用した場合
const targetRange = sheet.getRange(5, 1, 6, 5);
// マジックナンバーを使用しない場合
const startRow = 2;
const startColumn = 1;
const rangeRowCount = 6;
const rangeColumnCount = 5;
const targetRange = sheet.getRange(startRow, startColumn, rangeRowCount, rangeColumnCount);
コード量は増えますが、メンテナンスは定数部分の変更だけで良くなります。
マジックナンバーを使用しそうなポイントについては、必ず変数や定数を使いましょう。
GASの場合は異なるスクリプトファイル.gs
であっても、関数外で定義していれば度のスクリプトファイルからでも読み込めます。
変数・定数は下記のように、別のスクリプトファイルとして管理するとメンテナンスしやすいです。