Google 表格,“请求缺少有效的 API 密钥”

Gia*_*omo 7 authorization google-sheets google-apps-script google-sheets-api

我正在尝试使用Google Sheets API. 问题是,一旦我在谷歌电子表格上调用我的脚本函数,我就会收到以下错误:

对 sheet.spreadsheets.values.get 的 API 调用失败,错误为:请求缺少有效的 API 密钥。(第 5 行)。

其中,line 5在脚本如下所示:

var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;
Run Code Online (Sandbox Code Playgroud)

spreadsheetIdrangeName定义在第一行。

我认为问题可能是我没有在任何地方复制 API 密钥,但我真的不明白在哪里以及如何做到这一点。

我只是使用= function().

Tan*_*ike 6

当您通过自定义函数(如=myFunction()放置到单元格)使用 Sheets 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;
}
Run Code Online (Sandbox Code Playgroud)

解决方法 2:

如果要使用 Sheets API,则需要访问令牌。但是需要直接请求到Sheets API的端点,因为在Advanced Google Services内部会自动使用访问令牌。作为这种情况的一个问题,ScriptApp.getOAuthToken()在自定义函数中运行时null会返回。为了避免这种情况,作为一种方法,使用 PropertiesService 将访问令牌直接提供给自定义函数。示例流程如下。

  1. 当电子表格打开时,它通过 OnOpen 触发器将访问令牌放入 PropertiesService。
    • 当您使用它时,请onOpenFunc()在示例脚本中安装 OnOpen 触发器。
  2. 运行自定义函数时,PropertiesService 检索到的访问令牌用于使用 Sheets API。

这样,可以在自定义函数中使用 Sheets 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;
}
Run Code Online (Sandbox Code Playgroud)
  • access token 的过期时间为 1 小时。在此示例脚本中,使用了 PropertiesService。在这种情况下,如果在打开电子表格后花费 1 小时,则无法使用访问令牌。如果您想连续使用访问令牌,您还可以使用时间驱动触发器更新它。

笔记:

  • 使用 Sheets API 时,请在 API 控制台启用 Sheets API。

参考:

如果这些解决方法不是您想要的,我深表歉意。