必要な権限:https://www.googleapis.com/auth/spreadsheets
URLからGoogleドライブのファイル名を取得するための簡単なコードをappscriptに作成しました
function FileName (URL) {
var ss = SpreadsheetApp.openByUrl(URL);
return ss.getName();
}
それを実行すると、エラーが発生します。
例外:SpreadsheetApp.openByUrlを呼び出す権限がありません。必要な権限:https://www.googleapis.com/auth/spreadsheets (リーニャ6)。
Advanced GoogleServicesエリアでDriveand Sheets APIをすでに有効にしているので、「https://www.googleapis.com/auth/spreadsheets」は問題ないはずですが、そうではありません。
どうすればそれを機能させることができますか?
このリンクに、問題のある複製を含むサンプルシートを作成しました。
回答
問題の説明:
カスタム関数を使用しています。
それは公式ドキュメントで非常によく説明されています:
カスタム関数がエラーメッセージをスローする場合Xサービスを呼び出す権限がありません。サービスにはユーザー認証が必要であるため、カスタム関数で使用することはできません。
メッセージに明記さSpreadsheetApp.openByUrl(URL)れているように、カスタム関数内など、認証が必要なサービスを使用することは許可されていません。
SpreadsheetApp.openByUrl(URL);カスタム関数内で使用できないことを特に指摘する表もあります。
回避策:
通常の関数は複数の方法で使用できます。
- カスタムメニューボタンとして実装され、
- スクリプトエディタからそれらを実行し、
- 単純なトリガーを介してそれらを実行し、
- アドオンメニューなどを作成します。
スクリプトの通常の関数バージョン:
function FileName () {
var URL = "spreadsheet_url"
var ss = SpreadsheetApp.openByUrl(URL);
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
sheet.getRange('A1').setValue(ss.getName());
}
実行時に(スクリーンショットを参照)、このスクリプトはのセルA1の値をSheet1スプレッドシートファイルの名前に設定します。
このスクリプトで使用した関数を公式ドキュメントで探して、それぞれの機能を確認することをお勧めします。
更新:
シートを開いたところ、使用していることがわかりましたSpreadsheetApp.openByUrl(URL);が、このメソッドはスプレッドシートでのみ機能するため、クラス名SpreadsheetAppです。ファイルIDを開きたい場合は、getFileById(id)を使用する必要があります。最初の列にファイルUrlsがあるのがわかりますが、そのURLでファイルを開く方法はありません。そのようなファイルからのID:
https://drive.google.com/file/d/1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp/view?usp=sharing
は:
1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp
したがって、使用する必要があります
var files = DriveApp.getFileById('1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp')
コードスニペットは次のようになります。
function FileName () {
var URL = "1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp"
var file = DriveApp.getFileById(URL);
var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
sheet.getRange('B1').setValue(file.getName());
}
この質問は、さらに焦点を当てる必要のある質問になっているため、GASについてよく理解してください。