Maison > Questions et réponses > le corps du texte
avec IMPORTRANGE SpreadSheet A, B, C, etc. Demande l'accès pour extraire les données de SpreadSheet 1 (Figure 1). Exemple :
=IMPORTRANGE("SpreadSheet 1"; "Sheet!A1")
Je souhaite supprimer l'accès (révoquer l'autorisation) de la Feuille de calcul A pour extraire les données de la Feuille de calcul 1 (Image 2) Révoquer l'accès autorisé à l'image 1 pour révoquer l'autorisation accordée à la Feuille de calcul A de la Tableau électronique 1 Autorisation de extraire des données
Ceci n'est qu'un exemple simplifié car en réalité j'ai plus de 200 feuilles de calcul connectées à 1 (en fait 2) feuilles de calcul de base de données, c'est pourquoi je souhaite révoquer les autorisations, combien de feuilles de calcul peuvent accéder à une feuille de calcul. J'ai atteint cette limite plusieurs fois avec mon formulaire
Images de vraies feuilles de calcul pour aider à comprendre certaines parties de mon code, le script s'exécutera sur la même feuille de calcul en demandant l'accès
Je peux me tromper mais j'ai un vieux script qui, je pense, fonctionnait à un moment donné
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()); } } }
Mais maintenant, il affiche une erreurTypeError: targetFile.getPermissions is not a function
J'ai donc essayé de le modifier avec ce que je cherchais
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); } } }
Réussi mais ne fonctionne pas
Je ne connais pas exactement le fonctionnement de l'éditeur dans ce cas, et en cherchant, je ne trouve pas de questions ni de solutions associées
Je suis le propriétaire et le seul utilisateur, je ne suis pas sûr mais c'est lié au fichier et non à l'utilisateur, j'apprécie l'aide, merci
P粉9767371012024-03-31 17:12:27
Je crois que vos objectifs sont les suivants.
IMPORTRANGE
autorisées. IMPORTRANGE
dans votre feuille de calcul. Découvrez la méthode pour annuler directement l'autorisation IMPORTRANGE
de Spreadsheet. Malheureusement, je ne trouve pas la méthode. Cependant, nous savons déjà que lors de l'utilisation de points de terminaison, le processus d'autorisation peut être exécuté par un script. Ref Je pense que cela pourrait fonctionner comme une solution de contournement dans votre cas. Le déroulement de cette solution de contournement est le suivant.
IMPORTRANGE
, sauf pour la feuille de calcul que vous souhaitez révoquer. Suivez ce processus pour obtenir des feuilles de calcul Google en révoquant la feuille de calcul spécifique souhaitée.
Cependant, dans cette solution de contournement, l'ID de la feuille de calcul est différent de l'ID d'origine car la feuille de calcul d'origine a été copiée. Donc, je ne sais pas si cela sera utile dans votre situation réelle. Donc, je propose simplement cette solution de contournement.
Lorsque le processus ci-dessus est reflété dans l'exemple de script, cela devient le suivant.
Veuillez copier et coller le script suivant dans l'éditeur de script de la feuille de calcul d'origine, définir spreadsheetIdsOfdeletePermission
et enregistrer le script.
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
avec