こんにちは!
おでぃーです。
今回は、GASでonOpen関数を使用したメニューバーが表示されない事象の対処法について解説します。
onOpen()とは?
onOpen()はシンプルトリガーと呼ばれるものの1つで、トリガー設定をせずともスプレッドシートを開いたときに実行される関数です。
使用例としては、スプレッドシートのメニューバーにGAS実行用のボタンを作成したいときに使用されるのが多いイメージです。
下記例では、「settings」と「regular execution」というメニューを作成しています。
メニュー作成のスクリプトは下記の記事で解説していますので参考にしてください!
onOpen()が実行されない?
便利なonOpenですが、時に実行されないときがあります。
結論、その原因として考えられるのは、権限が必要なコードが含まれていることになります。
実際に実行されないときの例を見てみます。
まず、GASエディタの実行数画面を見てみると、
やはり「失敗しました」になっていますね。
その下のエラー内容を見ると、
Exception: SpreadsheetApp.openById を呼び出す権限がありません。必要な権限: https://www.googleapis.com/auth/spreadsheets at [unknown function]
と記載があります。
スプレッドシートを呼び出すメソッド:SpreadsheetApp.openByIdの部分でエラーが生じているようです。
実は、onOpen()ではこういった権限が必要なコードは処理することができません!
今回のSpreadsheetApp.openByIdでは、
APIエンドポイント:https://www.googleapis.com/auth/spreadsheets
を使用したAPIリクエストを送信しているのですが、これに権限が必要ということになります。
「あれ、でもonOpen()のなかに権限が必要なコードは含まれていないんだけどな、、?」
その通りです。
例えば、メニュー作成のコードであればたしかに含まれていないですよね。
では何が原因なのでしょうか?
エラー文の最後に、
(tweetWithImage:2:32)
と記載があります。
これは、どのgsファイルのどの行でエラーが生じているかを示しています。
実際にtweetWithImage.gsの2行目を見てみると、、
SpreadsheetApp.openByIdを関数の外で共通変数(textSheet)を定義する際に使用しています!
関数の外にあるコードは、どの関数が実行されたとしても処理されます。
つまり、onOpen()が実行されたときに上記のコードも処理されてしまったということです。
以上から、onOpen()が失敗したのは、
共通処理のなかに、権限が必要なコードを記載していた
というのが原因になります!
対処法
原因が判明したのであれば、対処は簡単です。
該当するコードを共通処理に記載しないことです。
具体的には、そのコードが必要な関数内すべてに挿入すればよいだけです。
とはいえ、スプレッドシートを開く処理くらい共通にしたいという気持ちは分かります。。
コードを綺麗にすることを優先する場合は、トリガー設定でonOpenをスプレッドシート起動時に実行されるようにすれば問題ありません。
まとめ
今回は、GASでonOpen関数が実行されない事象の原因と対処法について解説しました。
共通処理に原因があったとは、、私もこれまで長らく見落としていました笑
トリガー設定するか否かで対応は変わるので、そこを考慮してコーディングしていけるとよいですね!
コメント