質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

15318閲覧

「DriveApp.getFolderById を呼び出す権限がありません。」の解決について(言語:Google Apps Scritp)

bbbjoker1218

総合スコア8

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2019/08/15 04:31

前提・実現したいこと

GASでスプレッドシートの自作関数(GetFileId)を作成中です。

機能は「フォルダID」と「ファイル名」を引数で渡し
「ファイル名」と一致するファイルの「ファイルID」を返します。

スプレッドシートのセル(A1)に「=GetFileId("******","××××××××")」
と自作関数の呼び出しを記述するとエラーメッセージが発生しました。
******はフォルダID、××××××××はファイル名です。

発生している問題・エラーメッセージ

DriveApp.getFolderById を呼び出す権限がありません。必要な権限: (https://www.googleapis.com/auth/drive.readonly || https://www.googleapis.com/auth/drive)(行 4)が発生しました。

該当のソースコード

【ファイルID取得.gs】
function GetFileID(targetFolderID,targetFileName) {

//フォルダIDからフォルダオブジェクトを取得
var targetFolder = DriveApp.getFolderById(targetFolderID);

//フォルダ内のファイル一覧を取得
var filesList = targetFolder.getFiles();

//ファイルID
var targetFileID = ""

//ファイルが存在する間、ループする
while(filesList.hasNext()){

var file = filesList.next() //ファイルを取得 var fileName = file.getName(); //ファイル名を取得 //ファイル名が一致した場合、ファイルIDを取得 if (targetFileName == fileName){ targetFileID = file.getId() }

}
return targetFileID;

試したこと

https://qiita.com/hisayuki/items/725110707d8abc8796d8
に記載されている情報をもとにマニフェストファイルを以下の通りに変更しました。

【マニフェストファイルの内容】
{
"timeZone": "Asia/Tokyo",

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

"dependencies": {

},

"exceptionLogging": "STACKDRIVER"
}

補足情報(FW/ツールのバージョンなど)

ファイルID取得.gsからGetFileIDを直接実行すると上手く動作するんですが、
スプレッドシートからGetFileIDを呼び出すとエラーがでます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

残念ながらカスタム関数を使用する場合、getFolderById()のような一部の認証が必要なメソッドは使用することができません。UrlFetchApp.fetch()は使用可能ですが、アクセストークンを取得するためのメソッドは使用できません。そのため、Drive APIを使用したファイルIDの取得は直接実行することはできません。これらは仕様のようです。

回避策としまして次のような方法は如何でしょうか。

1. 実行方法の検討

認証可能な実行方法、例えば次のような実行方法は如何でしょうか。

  • スクリプトエディタで実行
  • イベントトリガーで実行
  • カスタムメニューで実行
  • ボタンを作成してボタンをクリックして実行

1. UrlFetchApp.fetch()の使用を検討

スプレッドシートが開いた際にプロパティサービスへ新しいアクセストークンを保存し、カスタム関数内で保存したアクセストークンを使用してUrlFetchApp.fetch()でDrive APIのエンドポイントを直接リクエストしてファイルIDを取得する。

投稿2019/08/15 05:23

kisojin

総合スコア899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bbbjoker1218

2019/08/15 05:47

仕様なんですね。 スクリプトエディタで実行できて、スプレッドシートからの呼び出しができない理由がわかりました。 ご教授ありがとうございました。
kisojin

2019/08/16 01:02

カスタム関数は誰でも実行できてしまうこともあり、制限が厳しいのだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問