【问题标题】:Requesting a BigQuery API from Google Spreadsheet generates an Error从 Google 电子表格请求 BigQuery API 会产生错误
【发布时间】:2020-07-24 15:27:46
【问题描述】:

我正在尝试从 Bigquery 获取数据并使用 App 脚本将它们显示到我的电子表格中。首先,我在 G 盘中创建了一个电子表格文件,然后将我的代码放入脚本编辑器中。

这是我用来从 Bigquery 获取所有数据集的代码:

    function getAllDataSets(filter){
  try{
    let req_for_datasets = BigQuery.Datasets.list(PROJECT_ID);
    let datasets = req_for_datasets.datasets;
    let list = [];
    datasets.forEach( obj => {
      if(obj.datasetReference.datasetId.indexOf(filter)>-1) 
        list.push(obj.datasetReference.datasetId);
    });
    return list;
  }catch(e){
    return [];
  }
}

这个脚本运行良好,我可以在通过代码编辑器运行我的脚本时看到结果。我尝试在 onOpen() 或 onEdit() 中使用此脚本,以便在打开电子表格时能够获取数据。 但使用电子表格我收到了这条消息:

GoogleJsonResponseException: API call to bigquery.tables.list failed with error: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.

这是我放在 onOpen 函数中的代码:

    function onOpen(){
  let ui = SpreadsheetApp.getUi();
  let method_list = ["SUM", "AVG", "COUNT"];
  //Adding a Custom menu
  ui.createMenu("Media Budget")
    .addItem("Facebook", "makeQuery")
    .addSeparator()
    .addItem("Google Ads", "makeQuery")
    .addToUi();

    
  //Getting all datasets from the specified project
  let dataset_list = getAllDataSets("dw_sandbox_");
  Browser.msgBox(dataset_list);
  //Creating dropdown list cell
  let cell = SHEET.getRange("B1");
  applyValidationToCell(dataset_list, cell);
  
}

除此之外,如果我尝试使用电子表格中的自定义菜单执行该功能,一切正常。

如果您能帮助我,将不胜感激。

【问题讨论】:

    标签: api google-apps-script google-sheets google-bigquery


    【解决方案1】:

    如果您可以在手动运行代码时执行请求,但不能在简单的 onOpen 或 onEdit 触发器上执行 - 原因是授权问题

    restrictions:

    因为简单的触发器会自动触发,无需询问用户 对于授权,它们受到一些限制:

    ...

    他们无法访问需要授权的服务。例如,一个 简单触发器无法发送电子邮件,因为 Gmail 服务需要 授权,但一个简单的触发器可以翻译一个短语 语言服务,是匿名的。

    解决方法

    • 选项 a)

      与其运行请求onOpen,不如将​​其实现为一个单独的函数,当从自定义菜单中选择该函数时将调用该函数

      示例:

    function onOpen(){
      let ui = SpreadsheetApp.getUi();
      let method_list = ["SUM", "AVG", "COUNT"];
      //Adding a Custom menu
      ui.createMenu("Media Budget")
      .addItem("Facebook", "makeQuery")
      .addSeparator()
      .addItem("Google Ads", "makeQuery")
      .addSeparator()
      .addItem("bigQuery", "makeBigQuery")
      .addToUi();  
    }
    
    function makeBigQuery(){
      //Getting all datasets from the specified project
      let dataset_list = getAllDataSets("dw_sandbox_");
      Browser.msgBox(dataset_list);
      //Creating dropdown list cell
      let cell = SHEET.getRange("B1");
        applyValidationToCell(dataset_list, cell);
    }
    
    • 选项 b)

      installable 上运行现有代码,而不是在简单触发器上运行。

    • 可安装的触发器可以运行需要授权的功能

    • 将您的简单触发器转换为可安装的触发器

      • 将函数从 onOpen 重命名(否则您可能会因为同时运行简单触发器和可安装触发器而遇到冲突)
      • 继续Edit -> Current project's triggers - > New trigger - 另见here

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 2015-07-23
      • 2022-01-13
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      相关资源
      最近更新 更多