首页  >  问答  >  正文

使用 IMPORTRANGE 删除一个电子表格从另一电子表格提取数据的权限

with IMPORTRANGE SpreadSheet A、B、C 等 请求访问权限以从 SpreadSheet 1 中提取数据(图 1)。示例:

=IMPORTRANGE("SpreadSheet 1"; "Sheet!A1")

我想从电子表格A中删除访问(撤销权限),以从电子表格1中提取数据(图2)撤消允许对图片1的访问,以撤销授予电子表格 A电子表格 1 提取数据的权限

这只是一个简化的例子,因为实际上我有超过200个电子表格连接到1个(实际上是2个)数据库电子表格,这就是为什么我想撤销权限,有多少个电子表格可以访问一个电子表格我已经多次达到这个限制了

真实电子表格的图片,以帮助理解我的部分代码,脚本将在请求访问的同一电子表格上运行

我可能是错的,但我有一个旧脚本,我认为曾经有用

function removePermission() 
{
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ss_c = ss.getSheetByName('Config');

  var currentSheetId = ss.getId();
  var targetId = "";

  if (ss_c.getRange("B6").getValue() == 1)
  {
    targetId = ss_c.getRange("D6").getValue();
  } 
  else if (ss_c.getRange("B6").getValue() == 2) 
  {
    targetId = ss_c.getRange("D7").getValue();
  }

  var currentFile = DriveApp.getFileById(currentSheetId);
  var targetFile = DriveApp.getFileById(targetId);
  var targetPermissions = targetFile.getPermissions();

  for (var i = 0; i < targetPermissions.length; i++) 
  {
    var permission = targetPermissions[i];
    if (permission.getType() == "user" && permission.hasAccess()) 
    {
      currentFile.removeEditor(permission.getEmail()); // or the next one
//    targetFile.removeEditor(permission.getEmail());
    }
  }
}

但现在它显示错误TypeError: targetFile.getPermissions is not a function

所以我尝试用我搜索的内容进行修改

function test() 
{
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ss_c = ss.getSheetByName('Config');

  var currentSheetId = ss.getId();
  var targetId = "";

  if (ss_c.getRange("B6").getValue() == 1) 
  {
    targetId = ss_c.getRange("D6").getValue();
  } 
  else if (ss_c.getRange("B6").getValue() == 2) 
  {
    targetId = ss_c.getRange("D7").getValue();
  }

  var currentFile = DriveApp.getFileById(currentSheetId);
  var targetFile = DriveApp.getFileById(targetId);
  var targetEditors = targetFile.getEditors();
  var currentEditors = currentFile.getEditors();
  var activeUserEmail = Session.getActiveUser().getEmail();

  for (var i = 0; i < targetEditors.length; i++) {
    var editor = targetEditors[i];
    var editorEmail = editor.getEmail();
    
    // Check if the editor exists in the current file before removing
    if (editorEmail !== activeUserEmail && currentEditors.some(e => e.getEmail() === editorEmail)) {
      targetFile.removeEditor(editorEmail);
    }
  }
}

通过,但不起作用

我不熟悉编辑器在这种情况下的具体工作方式,并且搜索我找不到相关的问题和解决方案

我是所有者和唯一的用户,不确定,但它与文件而不是用户相关,感谢帮助,谢谢

P粉511985082P粉511985082189 天前474

全部回复(1)我来回复

  • P粉976737101

    P粉9767371012024-03-31 17:12:27

    我相信您的目标如下。

    • 您有一个 Google 电子表格,其中包含授权的 IMPORTRANGE 函数。
    • 您想要撤销电子表格中对 IMPORTRANGE 的多项授权。

    问题和解决方法:

    查看了直接取消Spreadsheet的IMPORTRANGE授权的方法。不幸的是,我找不到该方法。但是,我们已经知道,当使用端点时,授权过程可以由脚本运行。 Ref 我认为这可能可以在您的情况下用作解决方法。此解决方法的流程如下。

    1. 复制原始电子表格。
    2. 授权 IMPORTRANGE,但您要撤销的电子表格除外。

    按照此流程,通过撤销您想要的特定电子表格来获取 Google 电子表格。

    但是,在此解决方法中,电子表格 ID 与原始 ID 不同,因为原始电子表格已被复制。所以,我不确定这对你的实际情况是否有用。所以,我只是提出这个解决方法。

    当上述流程反映在示例脚本中时,它变成如下。

    示例脚本:

    请将以下脚本复制并粘贴到原始电子表格的脚本编辑器中,并设置spreadsheetIdsOfdeletePermission并保存脚本。

    function myFunction() {
      // Please set the Spreadsheet IDs you want to revoke the authorization of "IMPORTRANGE".
      const spreadsheetIdsOfdeletePermission = ["###spreadsheetId1###", "###spreadsheetId2###",,,];
    
      // Retrieve original Spreadsheet.
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      const ssId = ss.getId();
      const orgFile = DriveApp.getFileById(ssId);
      const parent = orgFile.getParents().next();
    
      // Copy original Spreadsheet.
      const tempFile = orgFile.makeCopy(ss.getName() + "_new", parent);
      const tempFileId = tempFile.getId();
    
      // Authorize "IMPORTRANGE" except for "spreadsheetIdsOfdeletePermission"
      const tempSS = SpreadsheetApp.open(tempFile);
      const token = ScriptApp.getOAuthToken();
      const reqs = tempSS.createTextFinder("=IMPORTRANGE").matchFormulaText(true).findAll().reduce((ar, r) => {
        const id = r.getFormula().match(/^\=IMPORTRANGE\("(.*?)"/)[1].split("/")[5];
        if (!spreadsheetIdsOfdeletePermission.includes(id)) {
          const url = `https://docs.google.com/spreadsheets/d/${tempFileId}/externaldata/addimportrangepermissions?donorDocId=${id}`;
          ar.push({ url, method: "post", headers: { Authorization: `Bearer ${token}` }, muteHttpExceptions: true });
        }
        return ar;
      }, []);
      if (reqs.length == 0) return;
      const res = UrlFetchApp.fetchAll(reqs);
      res.forEach(r => {
        if (r.getResponseCode() != 200) {
          console.log(r.getContentText());
        }
      });
    }
    
    • 运行此脚本时,会复制原始电子表格,并通过撤销“IMPORTRANGE”的特定授权来创建新电子表格。

    注意:

    • 很遗憾,我无法了解您的实际情况。因此,如果发生与连续请求相关的错误,则可能需要在带有 Utilities.sleep 的循环中使用 UrlFetchApp.fetch 而不是 UrlFetchApp.fetchAll

    参考文献:

    回复
    0
  • 取消回复