19

当您在电子表格中手动输入 importrange 函数时,您会收到一个弹出窗口并且必须“允许访问”。弹出以允许访问 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.
...
4

5 回答 5

11

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

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

file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW)
于 2015-09-09T08:37:00.803 回答
11

@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);
}

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

  ...,
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/script.external_request"
  ],
  ...
于 2021-07-23T11:37:34.220 回答
5

我通过调用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 等)中做同样事情的人。

于 2021-04-27T09:45:31.340 回答
2

此代码基于@kishkin 的回答

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 引擎兼容,并且很容易在外部用作函数。

于 2022-01-12T07:40:29.570 回答
1

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

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

于 2019-08-20T06:12:54.333 回答