必要な権限:https://www.googleapis.com/auth/spreadsheets

Nov 18 2020

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」は問題ないはずですが、そうではありません。

どうすればそれを機能させることができますか?

このリンクに、問題のある複製を含むサンプルシートを作成しました。

回答

2 Marios Nov 18 2020 at 15:29

問題の説明:

カスタム関数を使用しています。

それは公式ドキュメントで非常によく説明されています:

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

メッセージに明記さSpreadsheetApp.openByUrl(URL)れているように、カスタム関数内など、認証が必要なサービスを使用することは許可されていません。

SpreadsheetApp.openByUrl(URL);カスタム関数内で使用できないことを特に指摘する表もあります。

回避策:

通常の関数は複数の方法で使用できます。

  1. カスタムメニューボタンとして実装され、
  2. スクリプトエディタからそれらを実行し、
  3. 単純なトリガーを介してそれらを実行し、
  4. アドオンメニューなどを作成します。

スクリプトの通常の関数バージョン

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についてよく理解してください。