【问题标题】:How to allow access for importrange function via apps script?如何允许通过应用程序脚本访问 importrange 功能?
【发布时间】:2015-01-20 06:07:20
【问题描述】:

当您在电子表格中手动输入导入范围函数时,您会收到一个弹出窗口并且必须“允许访问”。

但是,我正在尝试通过脚本找到一种方法来执行此操作,因为我正在创建许多电子表格,每个电子表格都有一个 query-importrange 函数(我“拥有”具有要导入数据的电子表格)。对于我来说,通过弹出窗口手动“允许访问”并更新功能以包含查询功能太多了。

因此,我正在应用程序脚本中寻找可以执行与弹出窗口相同的操作的函数调用。下面的代码段示例。

有人知道可以“允许访问”的功能吗? 斯蒂芬

// create new spreadsheet file
...
var ss = createSpreadsheet(fileName);
var spreadsheet = SpreadsheetApp.open(ss);
var sheet = spreadsheet.getSheetByName("Sheet1");

// Add student as Viewer
spreadsheet.addViewer(studentEmail);

// Add ImportRange function 
var sheet = spreadsheet.getSheets()[0];
var cell = sheet.getRange("A1");
var filter = "select * where Col3='" + studentEmail + "'";
var qry = '=QUERY(importRange("' + fileKey + '","14-15S2!A1:AE");"' + filter + '";1)';
cell.setValue(qry);
// I need a function to 'allow access' here, so the function can be allowed access. Otherwise, it throws an error.
...

【问题讨论】:

    标签: javascript google-apps-script google-sheets importrange


    【解决方案1】:

    @Franzi 建议使用有效且不需要公开捐赠者/来源电子表格的无证方法。以下是您可以通过 Google App Script 执行此操作的方法:

    function addImportrangePermission() {
      // id of the spreadsheet to add permission to import
      const ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
    
      // donor or source spreadsheet id, you should get it somewhere
      const donorId = '1GrELZHlEKu_QbBVqv...';
    
      // adding permission by fetching this url
      const url = `https://docs.google.com/spreadsheets/d/${ssId}/externaldata/addimportrangepermissions?donorDocId=${donorId}`;
    
      const token = ScriptApp.getOAuthToken();
    
      const params = {
        method: 'post',
        headers: {
          Authorization: 'Bearer ' + token,
        },
        muteHttpExceptions: true
      };
      
      UrlFetchApp.fetch(url, params);
    }
    

    通常不需要,但在极少数情况下,您可能希望在 appscript.json 清单中添加所需的 oauthScope:

      ...,
      "oauthScopes": [
        "https://www.googleapis.com/auth/spreadsheets",
        "https://www.googleapis.com/auth/script.external_request"
      ],
      ...
    

    【讨论】:

    • 你不需要为此修改清单。
    • @contributorpw 谢谢,修正了措辞 :)
    • 恐怕这对我不起作用,尽管它看起来是最有前途的解决方案。它仍然要求我连接两张纸:/
    • @yago 如果您想立即查看结果,您需要在获取链接后刷新您的接收方电子表格。或者删除公式并再次将其设置在单元格中。这有点不方便。
    • 感谢您的解释。在我的情况下,只用了半个小时左右就可以通过所有受影响的 ss 并允许访问捐赠者 ss,所以看到你的解决方案“不起作用”,我去手动做了。但是,我下次会记住这一点
    【解决方案2】:

    我遇到了与此类似的问题,发现答案是更改您从中导入数据的 spreadhseet 文件的权限(您的示例中的“filekey”)。

    这是使“允许访问”对我消失的谷歌应用脚​​本:

    file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW)
    

    【讨论】:

    • 这是唯一的解决方案 - 导入的工作表必须是公开的,而您不再拥有 Allow access。谢谢。
    • 请注意file.setSharing(DriveApp.Access.DOMAIN_WITH_LINK, DriveApp.Permission.VIEW);file.setSharing(DriveApp.Access.DOMAIN_WITH_LINK, DriveApp.Permission.EDIT); 不起作用。
    • 下面的答案现在是最新的有效解决方案——@Max Makhrov 的答案对我来说看起来最好
    【解决方案3】:

    我通过调用 addimportrangepermissions 端点使用gspread python 库自动执行此操作。

        sheet.client.request(
            'post',
            f'https://docs.google.com/spreadsheets/d/{sheet.spreadsheet.id}/externaldata/addimportrangepermissions',
            params={'donorDocId': external_sheet.spreadsheet.id}
        )
    

    我知道这不是通过应用程序脚本进行的,但它可以为您提供一些有关如何在其中执行此操作的提示。

    注意:我没有找到任何关于此的文档,因此我认为这可以帮助任何尝试在任何平台(应用脚本、python 等)中执行相同操作的人。

    【讨论】:

      【解决方案4】:

      此代码基于@kishkin 的answer

      function addImportrangePermission_(fileId, donorId) {
        // adding permission by fetching this url
        var url = 'https://docs.google.com/spreadsheets/d/' +
          fileId +
          '/externaldata/addimportrangepermissions?donorDocId=' +
          donorId;
        var token = ScriptApp.getOAuthToken();
        var params = {
          method: 'post',
          headers: {
            Authorization: 'Bearer ' + token,
          },
          muteHttpExceptions: true
        };
        UrlFetchApp.fetch(url, params);
      }
      

      兼容ES5引擎,方便作为外部函数使用。

      【讨论】:

      • 这是否可以在 API 文档中的任何位置查看?而且,为了清楚起见,这只是使用内部谷歌服务,对吧?没有引用外部服务?
      • 不知道,来自@Franzi 的回答
      【解决方案5】:

      我所做的只是与我的组织中使用 gsheet 模板的人员共享“源”表——ImportRange 从中获取数据的表。我通过单击授权访问按钮编辑了模板,此后我从模板制作的所有工作表都有效。

      ImportRange 函数无需我在从模板创建的每个新工作表中重新授权访问即可工作。我希望它适用于我组织中的其他人。

      【讨论】:

        猜你喜欢
        • 2014-02-16
        • 2013-03-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多