在 Apps 脚本中的自定义函数中,BigQuery 调用失败

Posted

技术标签:

【中文标题】在 Apps 脚本中的自定义函数中,BigQuery 调用失败【英文标题】:BigQuery calls failed in custom functions in Apps Script 【发布时间】:2012-06-01 06:03:07 【问题描述】:

我在 Apps Script 中编写了一个自定义函数,该函数使用函数参数构造查询并调用提供查询的 BigQuery 服务(我使用 API 密钥启用了该服务)。但是当我在电子表格中使用该函数时,它总是返回服务器错误。

error: We're sorry, a server error occurred. Please wait a bit and try again.

这是我的代码(当我通过手动提供变量在调试器中运行它时它可以工作):

function GetAge(first_name, last_name) 
  var select_text = "SELECT first_name, last_name, age FROM Testing.FullNames WHERE ";
  var filter_text = "first_name = '" + first_name + "' AND last_name= '" + last_name + "' ";
  var group_text = "GROUP BY 1,2;";
  var query_text = select_text + filter_text + group_text;

  var query = 'query': query_text;
  var response = BigQuery.Jobs.query('<My Project Id>', query);

  var value = response.getRows()[0].getF()[2].getV();

  return value;

【问题讨论】:

【参考方案1】:

v2 API 已启用?首次尝试运行时,是否提示您完成 OAuth 流程?

注意 - 一旦您克服了这个初始错误,您需要更改您的查询参数。查询调用只需要一个字符串作为第二个参数:

var response = BigQuery.Jobs.query('project_id', query_text);

【讨论】:

我认为已经启用了v2 API,但是在线文档仍然是v1。我尝试了您的语法,但似乎 v2 的 BigQuery.Jobs.query 将第二个参数作为 javascript 对象而不是字符串。突出的问题仍然是我在尝试调用电子表格中的函数时经常出现服务器错误。 v2 BigQuery.Jobs.query 方法肯定有两个必需参数:项目 ID 和查询文本。第三个参数是一个可选的 JS 对象,其中包含您希望传递的任何附加参数。我建议检查您为脚本选择的 API 版本! 嗨 jcondit,我尝试使用 v2 API,但仍然没有运气。我怀疑从自定义函数调用时与授权有关。不知道为什么这个问题仍然存在。 嘿 Jarod,我只是想让你知道,我认为这是一个错误。一个比我想象的要古老得多的错误。我担心如果它已经快一年了,它可能永远不会修复。 I submitted a bug report that can be found here【参考方案2】:

BigQuery 服务 v2beta1 目前仅限于部分受信任的测试人员。如果您改为使用 v2 版本(需要字符串查询),它应该可以工作。

【讨论】:

您好 Eric,我将 API 版本转换为 v2 并直接传递了 query_text,但仍然无法正常工作。我也尝试将带有我的 API 密钥的对象传递给函数,但没有运气。我怀疑问题是由于授权问题。似乎直接从自定义函数调用时,没有触发授权。 通过阅读 BigQuery 文档,看起来 query() 操作需要授权,而自定义函数不能使用任何需要授权的服务。这通常使用更好的错误消息来显示。如果您从菜单项或触发器运行查询,那么它应该可以正常工作。 谢谢,埃里克。这也是我所怀疑的。我会尝试与 BigQuery 团队确认。【参考方案3】:

有一个关于如何从 Google Apps 脚本 here 调用 BigQuery API 的教程。

【讨论】:

以上是关于在 Apps 脚本中的自定义函数中,BigQuery 调用失败的主要内容,如果未能解决你的问题,请参考以下文章

如何使用google apps脚本在自定义函数中编辑自定义函数的调用单元格?

Google Apps脚本未检测到当前行

Google Apps 脚本:自定义函数,仅根据条件连接多行中的首字母

在 Google Apps 脚本中使用 Adwords API (MccApp)

外部编辑器支持Google Apps脚本

Google Apps 脚本中的成功处理程序从服务器函数接收 null