はじまり
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_008.png)
はっ?
なんで、いつも通りスプレッドシートを開いて
onOpenでメニューが追加されないの!?
![135ml](https://www.endorphinbath.com/wp-content/uploads/2021/10/01_kinkinbeer135ml_001-2.jpg)
ああ〜、それは権限のエラーが出てるかもしれない・・・
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_001-1.png)
権限?
![135ml](https://www.endorphinbath.com/wp-content/uploads/2021/10/01_kinkinbeer135ml_001-2.jpg)
じゃあ、今回はそのことについて触れてみよう
事象
今回、直面したエラーはこんな感じのものです。
HtmlService()
を使って、スプレッドシートを開いた時にメニューが表示されるかと思いきや、全く表示されてこない・・・
![](https://www.endorphinbath.com/wp-content/uploads/2023/02/20230208_01-1024x311.jpg)
スクリプト編集画面で、こんな感じにGoogle Workspaceのサービスを叩いてみてもダメ・・・。
function authGoogleWorkspace(){
let ss = SpreadsheetApp.getActiveSheet();
let drive = DriveApp.getRootFolder();
let fetch = UrlFetchApp.fetch("https://www.google.com/?hl=ja");
}
原因
本当に意味がわからない!!
そう悩んでいた時にこの記事を発見。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZoPTMzNiZ0eHQ9JTVCR0FTJTVEJTIwJUU1JUFFJTlGJUU4JUExJThDJUUzJTgxJTk5JUUzJTgyJThCJUU2JUE4JUE5JUU5JTk5JTkwJUUzJTgxJThDJUUzJTgxJTgyJUUzJTgyJThBJUUzJTgxJUJFJUUzJTgxJTlCJUUzJTgyJTkzJUUzJTgwJTgyJUUzJTgxJUFCJUUzJTgxJUE0JUUzJTgxJTg0JUUzJTgxJUE2JUUzJTgxJUFFJUU1JUFGJUJFJUU3JUFEJTk2JUUzJTgxJUJFJUUzJTgxJUE4JUUzJTgyJTgxJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz03MjY2OGU3ZTNhZTJmY2EzMGRjM2M0MmIwMjQwMDZkZg&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwTmlja2VsQ3JlYXRlJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1mYmZhYWY0OWVjYzA5NmZjMjkxZmE4NmRmYmJhZmI2MQ&blend-x=142&blend-y=491&blend-mode=normal&s=842318e84ee363d74c728537ae152b5a)
どうやら、onOpenやonEditなどの自動実行トリガーは権限が最低らしい。士農工商で言ったら、えた・ひにんだ。
なので、少し強い権限が必要な機能を利用するためには、onOpenではないトリガーからスクリプトを実行しなければならないっぽい。
![](https://www.endorphinbath.com/wp-content/uploads/2023/02/20230208_02-1024x283.jpg)
まあ、僕が初めてこの事象と遭遇したのは、onOpenで使用するアプリ上でSpreadsheetApp.openById()
を使ったからなのですが、onOpenで実際に実行される処理内でSpreadsheetApp.openById()
が実行されているかどうかは関係なさそう。
僕の場合は、SpreadsheetApp.openById()
がonOpenと関係ない関数に入っているだけでちゃんと動きませんでした。
なので、SpreadsheetApp.openById()
を使うアプリでは、onOpenはトリガーを作成する処理だけを入れようと思ったわけです。
調査
僕は、onOpen関数に以下のような処理を入れました。
onOpen
でエラーになるので、そしたらonEdit
イベントハンドラを追加。そのonEdit
イベントでイベントハンドラを削除。(まあ、onEdit
もSimple Triggerなので権限弱そうだけど・・・)
function onOpen(){
try{
let ui = SpreadsheetApp.getUi();
const statement = ui.prompt(message).getResponseText();
let menuName = "フォルダ作成処理";
let objActions = [
{name: "作業ページ一覧表示処理", functionName: "displayListOfPagesToWork"}
, {name: "Display Thumbnails.", functionName: "displayThumbnails"}
];
// これがメニューを追加する関数。
onOpenToAddSpreadsheetMenu(menuName, objActions);
}catch(e){
SpreadsheetApp.getUi().alert("onOpen failed. " + e);
// Browser.msgBox("onOpen failed. " + e);
createTrigger();
}
}
function createTrigger(){
let sheet = SpreadsheetApp.getActiveSpreadsheet();
try{
ScriptApp.newTrigger("doOnOpen")
.forSpreadsheet(sheet)
.onEdit()
.create();
}catch(e){
SpreadsheetApp.getUi().alert("Initialization failed. " + e);
}
}
function doOnOpen(){
onOpen();
let triggers = ScriptApp.getProjectTriggers();
for(let i = 0; i < triggers.length; i++){
if(triggers[i].getEventType() === ScriptApp.EventType.ON_EDIT){
ScriptApp.deleteTrigger(triggers[i]);
}
}
}
そして、結果的には失敗。
トリガーは追加されていませんでした。
![](https://www.endorphinbath.com/wp-content/uploads/2023/02/20230208_03-1024x420.jpg)
次に、まずスクリプトが実行されているかどうかを検証。
スクリプトが走るなら、スプレッドシートを開いた時にダイアログが表示されるはず。
function onOpen(){
try{
// この2行を追加。
let ui = SpreadsheetApp.getUi();
const statement = ui.prompt(message).getResponseText();
let menuName = "フォルダ作成処理";
let objActions = [
{name: "作業ページ一覧表示処理", functionName: "displayListOfPagesToWork"}
, {name: "Display Thumbnails.", functionName: "displayThumbnails"}
];
onOpenToAddSpreadsheetMenu(menuName, objActions);
}catch(e){
SpreadsheetApp.getUi().alert("onOpen failed. " + e);
createTrigger();
}
}
実行してみると、ダイアログは表示されませんでした・・・
僕が遭遇しているSpreadsheetApp.openById()
の権限エラーは、自作の別ライブラリにある処理で引っかかっているようなので、そこの静的解析中にエラーになっているのかもしれない。
一応、解決
なので、スクリプト自体が実行されていないとなると、
- アプリのコンソール画面内でトリガー設定をするか
- スプレッドシートの中にスクリプトを実行するボタンを作るか
この2つしか方法はなさそうだったので、後者のボタンを設置する方法にしました。
やむを得ませんでした・・・無念・・・(まあ、こんな不具合に何時間も使ってられません。)
![](https://www.endorphinbath.com/wp-content/uploads/2023/02/20230208_04.jpg)
onOpen
関数をinitialize
関数に名前を変更して、ボタンに割り当てました。
initialize()
を実行することで、自作のメニューは追加されるようになりました。
おしまい
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_003.png)
良かった・・・なんとかメニューが追加された・・・
![135ml](https://www.endorphinbath.com/wp-content/uploads/2021/10/01_kinkinbeer135ml_001-2.jpg)
機能ごとに必要な権限が違うとは思わなかったね・・・
![リサちゃん](https://www.endorphinbath.com/wp-content/uploads/2021/10/02_nayutarisa_008.png)
知ったこっちゃない!
以上になります!
コメント