首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >谷歌页,“请求缺少一个有效的API键”

谷歌页,“请求缺少一个有效的API键”
EN

Stack Overflow用户
提问于 2019-03-11 11:32:22
回答 2查看 16.1K关注 0票数 9

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

对sheets.spreadsheets.values.get的API调用失败,错误:请求缺少一个有效的API键。(第5行)。

脚本中的line 5如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;

在第一行中定义了spreadsheetIdrangeName

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

我只使用= function()调用该函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-11 23:12:59

当您通过像=myFunction()这样的自定义函数对单元格使用Sheets时,就会发生这样的错误。运行自定义函数时,ScriptApp.getOAuthToken()返回null。我认为这是你们问题的主要原因。不幸的是,我认为这是规范。为了避免这个问题,我想提出两个解决办法。

解决办法1:

电子表格服务的一部分可以在自定义函数中使用。因此,使用此方法,它将获得与var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName).values;相同的结果。在脚本的情况下,不能使用openById()。脚本如下所示。

示例脚本:

代码语言:javascript
代码运行次数:0
运行
复制
function customFunc() {
  var rangeName = "#####"; // Please set this.

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

解决办法2:

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

  1. 当打开电子表格时,它会通过PropertiesService触发器将访问令牌放入OnOpen。
    • 使用此选项时,请在示例脚本中将OnOpen触发器安装到onOpenFunc()

  1. 当运行自定义函数时,PropertiesService检索的访问令牌用于使用Sheets。

这样,Sheets API就可以在自定义函数中使用。

示例脚本:

代码语言:javascript
代码运行次数:0
运行
复制
// 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控制台上启用Sheets。

参考文献:

如果这些解决办法不是你想要的,我道歉。

票数 9
EN

Stack Overflow用户

发布于 2022-11-23 19:07:28

我想感谢你,@Tanaike,你的回复(我没有足够的“观点”来进行投票或评论,所以我唯一的选择是一个‘答案’)我知道这个帖子已经有好几年了,但我想其他人可能会对我的个人经历感兴趣。

首先:“解决方案1”为我工作!

函数/方法"Sheets.Spreadsheets.Values.get(spreadsheetID,RangeName).values“给了我一个”缺少有效API键“错误,所以我把它换成了"sheet.getRange(RangeName).getValues()".。上述大多数都被设置为全局变量,即任何函数之外的变量。

奇怪的是,此错误仅在从容器表中运行时发生,而不是从“嵌入式”脚本中运行。

例如:如果我有一个active onOpen()函数,并且打开/刷新了工作表,脚本将记录一个“请求缺少一个有效的API键”。错误,并且我在其中构建的UI/菜单不会加载。但是,我可以在脚本本身中运行onOpen()函数,菜单将出现在工作表中,函数也会出现。如果禁用/重命名onOpen()函数并重新加载工作表,则不会收到错误消息。这是有意义的,因为表的简单加载似乎没有运行脚本,但是当您访问它(脚本)(即通过onOpen()函数)时,就会读取初始的全局变量(并且会发生错误)。但是,当我从脚本本身运行相同的函数或其他函数时,它们会运行ok。这个权限难题使我在互联网上大惊小怪,最终落地于此。

所有这些都是在许多其他问题之后,在解决这个问题的过程中,我构建了一个,添加了API(例如,用于工作表),将作用域添加到清单的oauthScopes部分,等等。

只有在我做了上面描述的替换之后,所有的事情才开始工作,无论是从脚本还是它的容器电子表格!所以,,谢谢

不管怎样..。很抱歉这么长时间,但我希望其他人能从你的解决方案中受益,在何种情况下,它对我有帮助。

干杯,-Paul

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55100926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档