Google Apps Script调用BigQuery.Jobs.get报「未找到」错误求助
问题
在Google表格的Apps Script中执行以下代码将表格数据上传至BigQuery,上传操作成功,但BigQuery.Jobs.get调用始终报错「API call to bigquery.jobs.get failed with error: Not found」。通过BigQuery UI确认job.jobReference.jobId返回的jobId正确,单独调用BigQuery REST API传入projectId、jobId和location(us-west3)可正常获取作业,但代码中未指定location参数,求问报错原因。
代码如下:
var tableId = tableName var job = { configuration: { load: { destinationTable: { projectId: projectId, datasetId: datasetId, tableId: tableId }, skipLeadingRows: 1, allowQuotedNewlines:true, quote: "'" } } }; csv_blob = Utilities.newBlob(csv,"application/octet-stream"); job = BigQuery.Jobs.insert(job, projectId, csv_blob ); var jobId=job.jobReference.jobId; var queryResults = BigQuery.Jobs.get(projectId, jobId); var sleepTimeMs = 500; while (!queryResults.jobComplete) { Utilities.sleep(sleepTimeMs); sleepTimeMs *= 2; queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId); }
原因与解决方法
- 核心原因:目标BigQuery数据集位于
us-west3区域,Apps Script的BigQuery服务默认使用US多区域请求作业信息。作业元数据存储在其创建时的区域节点中,不指定区域直接调用Jobs.get,服务会在默认区域查找,自然找不到对应作业。 - 修复方案:
- 调用
BigQuery.Jobs.get和BigQuery.Jobs.getQueryResults时,必须传入作业所在区域参数。可以直接从返回的job对象中提取jobReference.location的值,无需硬编码区域。 - 修改代码中的相关调用:
// 获取作业对应的区域 var jobLocation = job.jobReference.location; // 调用Jobs.get时传入区域参数 var queryResults = BigQuery.Jobs.get(projectId, jobId, {location: jobLocation}); // 循环中调用getQueryResults时同样传入区域 queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {location: jobLocation});
- 调用
- 补充说明:
Jobs.insert能成功是因为BigQuery会根据目标数据集的区域自动路由请求,但查询作业状态时必须明确指定区域,否则会触发默认区域查找,导致找不到作业的错误。
内容的提问来源于stack exchange,提问作者Ron Bailey
相关产品推荐
相关产品推荐

