Heim > Fragen und Antworten > Hauptteil
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粉9767371012024-03-31 17:12:27
我相信您的目标如下。
IMPORTRANGE
函数。IMPORTRANGE
的多项授权。查看了直接取消Spreadsheet的IMPORTRANGE
授权的方法。不幸的是,我找不到该方法。但是,我们已经知道,当使用端点时,授权过程可以由脚本运行。 Ref 我认为这可能可以在您的情况下用作解决方法。此解决方法的流程如下。
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()); } }); }
Utilities.sleep 的循环中使用 UrlFetchApp.fetch
而不是 UrlFetchApp.fetchAll
。