web-dev-qa-db-ja.com

API実行可能ファイルとしてデプロイされたアプリスクリプトがPermissionDeniedを返すのはなぜですか?

スクリプトエディタでスクリプトを作成し、「API実行可能ファイルとしてデプロイ」として公開しました。このスクリプト内で、シートにdoc_idを提供し、そのシートからデータを取得する関数を定義しました。

次に、 https://developers.google.com/apps-script/execution/rest/v1/scripts/run にアクセスして実行APIをテストしました。スコープを追加し、アプリを承認して試してみました。次のエラーメッセージが表示されます。

"error": {
  "code": 403,
  "message": "The caller does not have permission",
  "status": "PERMISSION_DENIED"
}

誰かが私が間違っていることを教えてもらえますか?

11
Bellave Jayaram

アプリスクリプトが正しい開発コンソールプロジェクトに関連付けられていることを確認してください。

スクリプトは、OAuth 2.0クライアントIDを使用)に対応する開発コンソールプロジェクトIDに関連付ける必要があります(この開発コンソールプロジェクトでは、「Apps ScriptExecutionAPI」も有効にする必要があります)。

アプリスクリプトの開発者コンソールプロジェクトを変更するには、次のメニュー項目を選択します。リソース>開発者コンソールプロジェクト...

この画面で、開発コンソールのプロジェクト番号を入力します。

24
Farhad Khairzad

すべてが正常であっても、"devMode":trueによってそのエラーを取得できます。このおかげで、他のユーザーのために展開しようとしたときに半日を無駄にしました。

将来の参考のために。

10
goodhyun

プロジェクトのエディターとしてサービスアカウントユーザーを追加するだけです

追加するサービスアカウントからのメールは次のようになります{project-name}@{project-name}.iam.gserviceaccount.com

3
chemdrew

私はあなたの提案をすべて混ぜ合わせました。さらに、プロジェクトの「廃止されていない」IDを使用する必要がありました。スクリプトを公開すると、所有者がルーチンを実行している限り、Google Chrome(Edgeで試してみると失敗します)内でのみ使用していたIDが表示されます。公開して別のユーザーで試してみると、機能しなくなります。スクリプトを開き、ファイル/プロジェクトのプロパティに移動して、代わりに長いスクリプトIDをコピーします。ルーチンはどのユーザーでも機能し始めます。次の画像では、赤で下線を引いています。開発者だけで機能するキー、および緑色ですべてのユーザーで機能するキー(目的に応じてカットされており、私の環境はスペイン語であるため、実際の翻訳オプションは異なる場合があります、申し訳ありません)

Project properties keys

要約する価値があると思います。

  1. ' 実行APIを使用 'および クイックスタート の指示に従って、スクリプトを実行APIとして公開します。 (スクリプトを作成し、Google Apps Script Execution APIを有効にし、全員がアクセスできるAPI実行可能ファイルとして公開します) enter image description here
  2. ファイル/共有で、スクリプトをすべての人に表示しました: API sharing settings
  3. 呼び出しでdevModeがtrueに設定されていないことを確認しました。ここでJavaScriptはsnipetを呼び出します: JavaScript call snippet
  4. プロジェクト内のすべてのスコープがOAuthリクエスト中に含まれていることを確認しました: API scopesAPI OAuth call
  5. すべてのセキュリティ権限を取得して準備を整えるには、数分待つ必要があります(つまり、OAuth認証情報)

基本的に、これらは、スクリプトを起動して実行するために従う必要のあるすべての必要な手順です。それが役に立てば幸い。最後に、失敗したときと成功したときに私が見たものを見てほしい: API call failAPI call success

ありがとうございました!

2
Chesare

私もエラーに直面し、すべてが一致して関連付けられていました...しばらく調査した後、シートはリンクで共有する必要がありますであることがわかりました。これはgoogleapisv4の制限です。

1
D.Dimitrioglo

同じ権限の問題があり、Googleスプレッドシートのステータスを公開に変更することで解決しました。これで、GETメソッドを使用してデータを読み取ることができます

0
victor