web-dev-qa-db-ja.com

GAS「openByIdを呼び出す権限がありません」

問題:スクリプトを実行すると、Googleは「OpenByIdを呼び出す権限がありません。「」

別のGoogleスプレッドシートからスクリプトをコピーし、target_ssKey変数のセル参照を変更して、ソースとターゲットの両方に適切なサイズの名前付き範囲を作成しましたスプレッドシート。

GASのドキュメントには、機能しない理由については何も記載されていません。

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#openById%28String%29

別のGASドキュメントには、 すべき カスタムメニューから呼び出すので、私のために働きます:

https://developers.google.com/apps-script/guides/sheets/functions#using_apps_script_services

上記の2番目のリンクは次のように述べています。

カスタム関数がエラーメッセージをスローした場合 Xサービスを呼び出す権限がありません。、サービスにはユーザー認証が必要であるため、カスタム関数で使用することはできません。

上記以外のサービスを使用するには、カスタム関数を作成する代わりに、AppsScript関数を実行するカスタムメニューを作成します。メニューからトリガーされる関数は、必要に応じてユーザーに承認を求め、その結果、すべてのAppsScriptサービスを使用できます。

関数を「カスタム関数」プロジェクトに入れてから「アドオン」プロジェクトに入れてみましたが、それでも同じエラーメッセージが表示されました。

私が間違っていることと、これを機能させる方法についてのアイデアはありますか?

これが私の正確なコードです:

function exportData_SStoSS() {
    //  Get the source data.
    var source_ss = SpreadsheetApp.getActiveSpreadsheet();
    var data = source_ss.getRangeByName("exportData").getValues();

    //  Identify the target.
    var controls_sh = source_ss.getSheetByName("Controls");
    var target_ssKey = controls_sh.getRange('C2').getValue();
    var target_ss = SpreadsheetApp.openById(target_ssKey);

    //  Paste the data to the target.
    target_ss.getRangeByName("importData").setValues(data);
};
11
user3014111

私は、この質問に私を連れて行ったのと同様の問題を投げかけると思いました。そこで、エラーYou don't have permission to call by openByIdを受け取りました。私の場合、この例からコピーしたtranslate.gsから関数を呼び出そうとしていました。

https://developers.google.com/apps-script/quickstart/docs

translate.gsの上部にあることに注意してください

/**
 * @OnlyCurrentDoc
 *
 * The above comment directs Apps Script to limit the scope of file
 * access for this add-on. It specifies that this add-on will only
 * attempt to read or modify the files in which the add-on is used,
 * and not all of the user's files. The authorization request message
 * presented to users will reflect this limited scope.
 */

ここでの犯人は@OnlyCurrentDocコメントです。参考のためにここを参照してください:

https://developers.google.com/apps-script/guides/services/authorization

@OnlyCurrentDocを削除すると、この問題が修正されました

12
ScottMcC

私はこの公式ノートを見つけました。これは問題の原因を明らかにすると信じています。

関数がカスタム関数である場合、つまりシート自体で通常のスプレッドシート関数のように使用できる場合は、アクセスが制限され、他のスプレッドシートを開くことができません。

同じスクリプトできますが、メニューボタンなどから他のスプレッドシートを開くことができます。

リンク: developers.google.comのドキュメント

9

気にしないで、私はそれを理解しました!

メソッドopenByIDは、「空白のプロジェクト」から呼び出すことができますが、「スプレッドシートのカスタム関数」や「Googleスプレッドシートのアドオン」プロジェクトから呼び出すことはできません。

「空白のプロジェクト」では、スプレッドシートに接続されていないプロジェクトが作成されると思いましたが、間違っていました。空白のプロジェクトは私のスプレッドシートに接続されています。私が使用しようとした他のタイプのプロジェクトは、スクリプトプロジェクトのスコープが限定されたバージョンのようで、一部のGASメソッドを実行できません。

1
user3014111

スクリプトの内容をメモドキュメントにコピーしてから、すべての関数をスクリプトに削除するだけです。スプレッドシートを閉じて、コンテンツをメモドキュメントに再度スクリプトに挿入します。スクリプトを再度実行すると、Googleはスクリプトの実行に同意するように求めますが、それだけです。ある種のGASクラスには、スクリプトに対する更新権限が必要です。

0
Jorge Sanz