Tl; Dr私のパートナーと私は、スプレッドシートを開くときに「ランダムにのみ」「そのアクションを実行するアクセス権がありません」をスローするGoogleスプレッドシートアドオンを公開しました。 onOpen
関数は、実行の承認を必要としません。
このエラーを再現/デバッグする方法はありますか?
以下は、「最小限の完全で検証可能な例」ですが、これまでのところエラーを再現できませんでした。これは単純なonOpen
関数で、2つのオプションを持つメニューを作成するだけです。
ファイルAddon.gs
function onOpen(e) {
SpreadsheetApp.getUi().createAddonMenu()
.addItem('Menu item 1', 'doSomething1')
.addItem('Menu item 2', 'doSomething2')
.addToUi()
}
function doSomething1(){
SpreadsheetApp.getUi().alert('Something 1');
}
function doSomething2(){
SpreadsheetApp.getUi().alert('Something 2');
}
昨日、Stackdriverログに次のエラーが表示されます
そのアクションを実行するためのアクセス権がありません。このアイテムの所有者にアクセスを許可するよう依頼してください。 atOpen(アドオン:109)
ここで、109行目は.addToUi()
です。
以前のバージョンのアドオンでも同じエラーが発生しました
これらのバージョンでは、onOpen
関数に変更はありませんでした(14、18、20)。
スプレッドシートを作成し、アドオンをインストールしていない他のアカウントと編集者アクセスおよび閲覧者アクセスで共有しましたが、エラーは発生しませんでした。
「mcve」に含まれていなかったと思うアドオンの詳細
アドオンには
.gs
と.html
の両方のいくつかのファイルvar
ステートメントがあり、リテラル(シートの名前を変数に、番号を変数に割り当てる)と、サイドバーからクライアント側のコードから後で呼び出される名前空間を割り当てます。Stack Overflowには、「そのアクションを実行するためのアクセス権がありません」というエラーメッセージについていくつかの質問があることがわかりましたが、承認を実行する必要のあるステートメントのないonOpen
関数に関するものはありません。
この質問は、ログインが必要な複数のアカウントのエラーに関連しているとは思いません。認証を必要とする関数がgoogle.script.run
を使用してクライアント側のコードから呼び出されると発生しますが、この場合、スプレッドシートのアドオンにaddToUi()
メソッドは、実行の承認を必要としません。
前のコードの小さなバリアントを作成して、openイベントオブジェクトをログに記録しました。
function onOpen(e) {
console.info(e);
SpreadsheetApp.getUi().createAddonMenu()
.addItem('Menu item 1', 'doSomething1')
.addItem('Menu item 2', 'doSomething2')
.addToUi()
}
function doSomething1(){
SpreadsheetApp.getUi().alert('Something 1');
}
function doSomething2(){
SpreadsheetApp.getUi().alert('Something 2');
}
次に、新しいスプレッドシートを作成し、それを使用してアドオンを有効(AuthMode = LIMITED)に設定してテストを行った後、リンクを編集できるユーザーとスプレッドシートを共有し、Chromeですが、メニューが表示されず、スクリプト実行ページにログエントリがありません
Stackdriver Loggingを使用できるようにするために、Google Cloud Standardプロジェクトのデフォルトプロジェクトを置き換えました。これは、匿名ユーザーがスプレッドシートにアクセスしているときにログに記録されるものです
ストレージからの読み取り中にサーバーエラーが発生しました。エラーコードPERMISSION_DENIED。
上記のエラーのため、いくつかの「未定義」メッセージを表示する制限付きスクリプトを作成しました。この各メッセージは、Type = Editorを使用したスクリプトの実行ページのアイテムに対応しています。エディターからスクリプトを実行しなかったので不思議なことです。
オープニングイベントを自動的にログに記録して支援したい場合
このリンク を使用して、有効モードでアドオンとして実行します
this other link を使用して、制限付きスクリプトとして実行します(別のスクリプトプロジェクト、同じGoogle Cloudプロジェクト)
関連質問: GoogleアプリのJavaScriptが匿名ユーザーに対して実行されませんか?
関連する問題 新しいスプレッドシートで匿名ユーザーに対してonOpenイベントが発生しない
私はもう一度試しました
function onOpen(e) {
var locale = SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetLocale();
var menu = SpreadsheetApp.getUi().createAddonMenu();
if( locale !== 'en_US' ){
menu.addItem( 'Change to en_US', 'changeToUS' )
} else {
menu.addItem( 'Change to es_ES', 'changeToES' )
}
menu.addToUi();
}
function changeToUS(){
console.info( 'Changing to en_US' );
SpreadsheetApp.getActiveSpreadsheet().setSpreadsheetLocale( 'en_US' );
console.info( 'Changed to en_US' );
}
function changeToES(){
console.info( 'Changing to es_ES' );
SpreadsheetApp.getActiveSpreadsheet().setSpreadsheetLocale( 'es_ES' );
console.info( 'Changed to es_ES' );
}
複数のアカウントがサインインしている別のアカウントでスプレッドシートを開きます。このアカウントがデフォルトのアカウントです。
次の画面は、匿名ユーザーがスプレッドシートを表示していることを示しています
そこで、Google Cloud Standardプロジェクトを追加し、他のアカウントを使用してスプレッドシートを更新しましたが、エラーを表示する代わりに、コードが安全でないことを示す警告が表示されたため、引き続きスクリプトを承認します。次に、メニューをもう一度クリックすると、今度はスクリプトが実行されました。
次に、スクリプト認証を削除し、2番目のアカウントでエラーを発生させずにスプレッドシートを開きましたが、場所の変更によりタブが更新された後、メニューのクリックに使用されたアカウントではなく、デフォルトのアカウントでスプレッドシートが開かれました。
これまでのところ、エラーを再現できるようにするには、「エンチラーダ全体」(アドオンとして公開)を実行する必要があるようです。
会話を読んで少し調査しましたが、アドオン認証の問題について G Suiteサポート にお問い合わせください。しかし Anonymous users are not able the run triggers
問題は意図的な動作です。より最近の Feature Request がこれを実装することを要求しています。