ushisangyo
@ushisangyo

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GASのOAuthスコープの設定でエラーと戦っています。

解決したいこと

スプレッドシートのコンテナバインドスクリプトで独自関数を作成しています。

関数の処理の内容は、コンテナしているスプレッドシートとは別のスプレッドシートのA1セルに入力されている値を取得して、returnするという単純なものです。

最終的にコンテナしているスプレッドシートの任意のセルに作成した独自関数を入力して取得した値を表示させたいです。

関数内でDriveApp.getFolderByIdメソッドを使うので、マニュフェストファイルに以下のように記述しました。

"oauthScopes":[
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/drive"
]

その上で、任意のセル上で関数を入力したのですが、セルに#ERROR!と表示され、下記のエラーメッセージが表示されます。
どなたかお詳しい方、エラーの解決方法をお教えいただけますと幸いです。

発生している問題・エラー

Exception: You do not have permission to call DriveApp.getFolderById. Required permissions: (https://www.googleapis.com/auth/drive.readonly || https://www.googleapis.com/auth/drive)が発生しました。

該当するソースコード

/*
    testという名前の別のスプレッドシートのA1セルの値をコンテナしているスプレッドシートの任意のセルに表示させたい。
*/


function func() {
  let files = DriveApp.getFolderById('任意のフォルダID').getFiles();

  let id;
  while(files.hasNext()){
    let file = files.next();
    if(file.getName()==='test'){   
      id = file.getId()
    } 
  }

  let value = SpreadsheetApp.openById(id).getSheetByName('シート1').getRange(1,1).getValue();

  return value
}

自分で試したこと

ネットで見た他の方の記事に、OAuthスコープを設定した後該当の関数をスクリプトエディタ上で実行し、開いたダイアログの指示に従って認証すれば動くと書いてあったのですが、試してみてもエラーは消えませんでした。

0

2Answer

ネットで見た他の方の記事に、OAuthスコープを設定した後該当の関数をスクリプトエディタ上で実行し、開いたダイアログの指示に従って認証すれば動くと書いてあった

該当記事のリンクを追記していただけると、何がどう違うかがわかるかもしれません。

本件ですが、実行可能APIとしてデプロイしたいのか、GAS IDEなどから実行したいのかどちらでしょうか。

実行可能APIとしてデプロイしたい場合

Required permissions: (https://www.googleapis.com/auth/drive.readonly || https://www.googleapis.com/auth/drive)

とあるので https://www.googleapis.com/auth/drive.readonly をcredentialsやtokenのscopeに追加してみるのは如何でしょうか。

GASのIDEなどから実行したい場合

マニフェストファイル (appsscript.json) にOAuthスコープを記載するのは別ドメインのデータやAPIへのアクセスが絡むときだけな気がします。
もしtestスプレッドシートが自分のドメイン内にあるのであれば、試しに

"oauthScopes":[
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/drive"
]

を消したら動かないですかね。
外部ドメインの場合はアクセス権限は有していますか?

1Like

@nyanko-box様、ありがとうございます。

以下が参考にさせていただいたwebページのURLです。
https://zenn.dev/seya/articles/709659242512a7

作成した関数を独自関数として、スプレッドシートの任意のセルに"=func()"と入力することで返り値を表示させたいです。

取得したい値のあるtestスプレッドシートも、コンテナしているスプレッドシートも、マイドライブにあるので自分のドメイン内です。
おっしゃるようにマニフェストファイルからauthScopesを削除してみたのですが、依然として同じエラーが返ってきてしまいます。

0Like

Comments

  1. 作成した関数を独自関数として、スプレッドシートの任意のセルに"=func()"と入力することで返り値を表示させたいです。

    理解しました。
    Google Apps Scriptのユーザーカスタム関数を確認してみましたが、使えるWorkspaceアプリケーションに制限?があるようです。

    個人データにアクセスできないサービス(特に次のようなサービス)のみを呼び出すことができます。
    (https://developers.google.com/apps-script/guides/sheets/functions?hl=ja#using_services)

    例えば上記URLからサポート対象のサービス一覧を確認すると、スプレッドシートは対象ですが、ドライブは対象ではなさそうです。
    現在の実装を SpreadsheetApp.openById({任意のID}) に替えて、読み込むスプレッドシートを直接取得するようにするとどうでしょうか。

    今後のやりたいことに対して方針を変える必要があるかもしれませんが、取り急ぎ動くかどうかの確認ということで。

  2. 五月雨式に申し訳ないですが、

    カスタム関数がエラー メッセージ You do not have permission to call X service. をスローした場合、サービスはユーザー認証が必要なため、カスタム関数では使用できません。
    上記以外のサービスを使用するには、カスタム関数を作成する代わりに、Apps Script 関数を実行するカスタム メニューを作成します。メニューからトリガーされる関数は、必要に応じてユーザーに承認を求めるため、Apps Script サービスをすべて使用できます。

    とも書かれていますね。
    私の環境で

    • appsscript.jsonに "oauthScopes":["https://www.googleapis.com/auth/spreadsheets"] を追記
    • SpreadsheetApps.openById("ID") で別のスプレッドシートを指定
      と試してみましたがPermission Errorとなってしまいました。
  3. @ushisangyo

    Questioner

    @nyanko-box 様、ありがとうございます。
    貼っていただいたリンクを確認させていただいたところ、仰るようにドライブサービスは対象ではないようですね。openByIdメソッドやopenByUrlメソッドで別のスプレッドシートを開くこともできないそうです。
    別の方法を考えてみようと思います。

    @nyanko-box 様、快く相談に応じていただきありがとうございました。感謝致します。

Your answer might help someone💌