You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,服务会在默认区域查找,自然找不到对应作业。
  • 修复方案:
    1. 调用BigQuery.Jobs.get和BigQuery.Jobs.getQueryResults时,必须传入作业所在区域参数。可以直接从返回的job对象中提取jobReference.location的值,无需硬编码区域。
    2. 修改代码中的相关调用:
      // 获取作业对应的区域
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 21:25:13