首頁  >  問答  >  主體

使用 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 天前479

全部回覆(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
  • 取消回覆