web-dev-qa-db-ja.com

Googleシート、「要求に有効なAPIキーがありません」

Google Sheets APIを使おうとしています。問題は、Googleスプレッドシートでスクリプト機能を呼び出すと、次のエラーが発生します。

Sheets.SpreadSheets.Values.getへのAPI呼び出しエラーで失敗しました:要求に有効なAPIキーがありません。 (5行目)。

スクリプト内のline 5は次のようになります。

var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;

そしてspreadsheetIdrangeNameは1行目に定義されています。

私は私がAPIキーをどこでもコピーしなかったという問題があるかもしれませんが、私は本当にどこでそれをするか理解していません。

= function()を使用して関数を呼び出します。

7
Giacomo

=myFunction() muth_function__のようなカスタム関数によってシートAPIを使用すると、そのようなエラーが発生します。カスタム関数が実行されると、ScriptApp.getOAuthToken()nullを返します。これが主にあなたの問題の理由であると思います。そして残念ながら、これが仕様であると思います。この問題を回避するために、私は2回の回避策を提案したいと思います。

回避策1:

スプレッドシートサービスの一部をカスタム関数で使用できます。これを使用して、var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;で同じ結果を取得します。スクリプトの場合、openById()は使用できません。そのため、スクリプトは次のとおりです。

サンプルスクリプト:

_function customFunc() {
  var rangeName = "#####"; // Please set this.

  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var values = sheet.getRange(rangeName).getValues();
  return values;
}
_

回避策2:

Sheets APIを使用する場合は、アクセストークンが必要です。しかし、アクセストークンは自動的にAdvanced Googleサービスの内部で自動的に使用されるため、シートAPIの終点に直接要求する必要があります。この場合の問題として、カスタム関数でScriptApp.getOAuthToken()が実行されると、nullが返されます。これを回避するために、方法として、アクセストークンはPropertiesServiceを使用してカスタム関数に直接与えられます。サンプルの流れは以下の通りです。

  1. スプレッドシートが開かれると、OnopenトリガーによってアクセストークンをPropertiesServiceに入力します。[。____]
    • これを使用するときは、サンプルスクリプトのonOpenFunc()にOnopenトリガをインストールしてください。
  2. カスタム関数が実行されると、Propertiesserviceによって取得されたアクセストークンはSheets APIの使用に使用されます。

これにより、シートAPIをカスタム関数で使用できます。

サンプルスクリプト:

_// Please install OnOpen trigger to this function.
function onOpenFunc() {
  PropertiesService.getScriptProperties().setProperty("accessToken", ScriptApp.getOAuthToken());
}

function customFunc() {
  var spreadsheetId = "#####"; // Please set this.
  var rangeName = "#####"; // Please set this.

  var accessToken = PropertiesService.getScriptProperties().getProperty("accessToken");
  var url = "https://sheets.googleapis.com/v4/spreadsheets/" + spreadsheetId + "/values/" + rangeName;
  var res = UrlFetchApp.fetch(url, {headers: {"Authorization": "Bearer " + accessToken}});
  var obj = JSON.parse(res.getContentText());
  var values = obj.values;
  return values;
}
_
  • アクセストークンの除去時間は1時間です。このサンプルスクリプトでは、PropertiesServiceが使用されます。この場合、スプレッドシートを開いた後に1時間が費やされた場合、アクセストークンは使用できません。アクセストークンを連続して使用する場合は、タイム主導のトリガーを使用して更新することもできます。

ノート:

  • Sheets APIを使用する場合は、APIコンソールでSheets APIを有効にしてください。

参照:

これらの回避策があなたが望むものではなかったならば、私は謝罪します。

5
Tanaike