Heim  >  Fragen und Antworten  >  Hauptteil

Verwenden Sie IMPORTRANGE, um einer Tabellenkalkulation die Berechtigung zum Extrahieren von Daten aus einer anderen Tabellenkalkulation zu entziehen

mit IMPORTRANGE SpreadSheet A, B, C usw. Fordert Zugriff an, um Daten aus SpreadSheet 1 zu extrahieren (Abbildung 1). Beispiel:

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

Ich möchte den Zugriff (Berechtigung widerrufen) aus Tabelle A entfernen, um Daten aus Tabelle 1 zu extrahieren (Bild 2). Den Zugriff auf Bild 1 widerrufen, um die für Tabelle A erteilte Berechtigung aus Elektronischer Tabelle 1 zu widerrufen Daten extrahieren

Dies ist nur ein vereinfachtes Beispiel, da ich tatsächlich über 200 Tabellenkalkulationen habe, die mit 1 (eigentlich 2) Datenbank-Tabellenkalkulationen verbunden sind. Deshalb möchte ich Berechtigungen widerrufen. Wie viele Tabellenkalkulationen können auf eine Tabellenkalkulation zugreifen? Diese Grenze habe ich mit meinem Formular schon oft erreicht

Bilder echter Tabellenkalkulationen, um Teile meines Codes besser zu verstehen. Das Skript wird auf derselben Tabellenkalkulation ausgeführt und fordert Zugriff an

Ich könnte mich irren, aber ich habe ein altes Drehbuch, von dem ich glaube, dass es einmal funktioniert hat

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

Aber jetzt wird ein Fehler angezeigtTypeError: targetFile.getPermissions is not a function

Also habe ich versucht, es mit dem zu modifizieren, wonach ich gesucht habe

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

Bestanden, funktioniert aber nicht

Ich weiß nicht genau, wie der Editor in diesem Fall funktioniert, und beim Suchen kann ich keine entsprechenden Fragen und Lösungen finden

Ich bin der Eigentümer und einzige Benutzer, ich bin mir nicht sicher, aber es hängt mit der Datei zusammen, nicht mit dem Benutzer. Vielen Dank für die Hilfe, danke

P粉511985082P粉511985082189 Tage vor477

Antworte allen(1)Ich werde antworten

  • 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

    参考文献:

    Antwort
    0
  • StornierenAntwort