【Google Apps Script】onOpen時に「Spreadsheet.openByIdを呼び出す権限がありません」となり、メニューが追加されない

927 語
5 分
【Google Apps Script】onOpen時に「Spreadsheet.openByIdを呼び出す権限がありません」となり、メニューが追加されない

はじまり#

リサちゃん avatar
リサちゃん
はっ? なんで、いつも通りスプレッドシートを開いてonOpenでメニューが追加されないの!?
135ml avatar
135ml
ああ〜、それは権限のエラーが出てるかもしれない・・・
リサちゃん avatar
リサちゃん
権限?
135ml avatar
135ml
じゃあ、今回はそのことについて触れてみよう

事象#

今回、直面したエラーはこんな感じのものです。 HtmlService()を使って、スプレッドシートを開いた時にメニューが表示されるかと思いきや、全く表示されてこない・・・

スクリプト編集画面で、こんな感じにGoogle Workspaceのサービスを叩いてみてもダメ・・・。

function authGoogleWorkspace(){
let ss = SpreadsheetApp.getActiveSheet();
let drive = DriveApp.getRootFolder();
let fetch = UrlFetchApp.fetch("https://www.google.com/?hl=ja");
}

原因#

本当に意味がわからない!! そう悩んでいた時にこの記事を発見。

どうやら、onOpenonEditなどの自動実行トリガーは権限が最低らしい。士農工商で言ったら、えた・ひにんだ。 なので、少し強い権限が必要な機能を利用するためには、onOpenではないトリガーからスクリプトを実行しなければならないっぽい。

まあ、僕が初めてこの事象と遭遇したのは、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]);
}
}
}

そして、結果的には失敗。 トリガーは追加されていませんでした。

次に、まずスクリプトが実行されているかどうかを検証。 スクリプトが走るなら、スプレッドシートを開いた時にダイアログが表示されるはず。

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つしか方法はなさそうだったので、後者のボタンを設置する方法にしました。 やむを得ませんでした・・・無念・・・(まあ、こんな不具合に何時間も使ってられません。)

onOpen関数をinitialize関数に名前を変更して、ボタンに割り当てました。 initialize()を実行することで、自作のメニューは追加されるようになりました。

おしまい#

リサちゃん avatar
リサちゃん
良かった・・・なんとかメニューが追加された・・・
135ml avatar
135ml
機能ごとに必要な権限が違うとは思わなかったね・・・
リサちゃん avatar
リサちゃん
知ったこっちゃない!

以上になります!

記事を共有

この記事が役に立ったなら、ぜひ他の人と共有してください!

【Google Apps Script】onOpen時に「Spreadsheet.openByIdを呼び出す権限がありません」となり、メニューが追加されない
https://endorphinbath.com/posts/gas-onopen-auth-error/
著者
kinkinbeer135ml
公開日
2023-02-08
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【Google Apps Script】自分がGASで使うIDとかトークンを1つのシートで管理するライブラリを作ろうとしたけど、断念した話
Code Google Apps Scriptで使うフォルダIDやスプレッドシートIDなどを一括管理するライブラリをスプレッドシート上で作ろうと思ったのですが、とある理由により頓挫しました。貴方もお気を付け下さい。
2
【GAS】Googleカレンダーに曜日を指定してスケジュールを登録するスプレッドシートの構築
Code Google Apps Scriptを使い、スプレッドシートからGoogleカレンダーに曜日指定でスケジュールを追加するシステムを作りました。繰り返し入力する版と個別に入力する版があります。
3
【GAS、Google Spreadsheet】Googleドキュメントで日記を付けるために毎日Docファイルを作ってくれるスクリプトです
Code GoogleDriveにあるファイルを毎日決まった時間にコピーしてくれるスクリプトを書きました。日記をつける場合に毎回ファイルをコピーしてレイアウトを変えて・・・といった作業を効率化してしまいましょう!
4
【GAS】Googleスプレッドシートではテーマカラーが変えられる! SpreadsheetThemeクラスをいじってみる
Software あなたはGoogleスプレッドシートではテーマカラーを変えられるって知っていましたか?デフォルトで用意されているテーマは16種類あるようなので全部試してみました。
5
Google Apps Scriptまとめ
Code Google Apps Scriptに関する今までの記事を一つの場所に一覧にしました。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次