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)
和spreadsheetId
和rangeName
定义在第一行。
我认为问题可能是我没有在任何地方复制 API 密钥,但我真的不明白在哪里以及如何做到这一点。
我只是使用= function()
.
当您通过自定义函数(如=myFunction()
放置到单元格)使用 Sheets API 时,会发生此类错误。当自定义函数运行时,ScriptApp.getOAuthToken()
返回null
. 我认为这是您出现问题的主要原因。不幸的是,我认为这就是规范。为了避免这个问题,我想提出 2 个解决方法。
电子表格服务的一部分可以在自定义函数中使用。因此,使用它,它获得与 相同的结果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)
如果要使用 Sheets API,则需要访问令牌。但是需要直接请求到Sheets API的端点,因为在Advanced Google Services内部会自动使用访问令牌。作为这种情况的一个问题,ScriptApp.getOAuthToken()
在自定义函数中运行时null
会返回。为了避免这种情况,作为一种方法,使用 PropertiesService 将访问令牌直接提供给自定义函数。示例流程如下。
onOpenFunc()
在示例脚本中安装 OnOpen 触发器。这样,可以在自定义函数中使用 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)
如果这些解决方法不是您想要的,我深表歉意。