Maison  >  Questions et réponses  >  le corps du texte

Utilisez IMPORTRANGE pour supprimer l'autorisation d'une feuille de calcul d'extraire des données d'une autre feuille de calcul.

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粉511985082P粉511985082189 Il y a quelques jours476

répondre à tous(1)je répondrai

  • P粉976737101

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

    Je crois que vos objectifs sont les suivants.

    • Vous disposez d'une feuille de calcul Google qui contient des fonctions IMPORTRANGE autorisées.
    • Vous souhaitez révoquer plusieurs autorisations pour IMPORTRANGE dans votre feuille de calcul.

    Problèmes et solutions :

    Découvrez la méthode pour annuler directement l'autorisation IMPORTRANGEde 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.

    1. Copiez la feuille de calcul originale.
    2. Autorisation 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.

    Exemple de script :

    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());
        }
      });
    }
    
    • Lorsque vous exécutez ce script, la feuille de calcul originale est copiée et une nouvelle feuille de calcul est créée en révoquant l'autorisation spécifique pour "IMPORTRANGE".

    Remarque :

    • Malheureusement, je ne peux pas comprendre votre situation réelle. Par conséquent, si une erreur se produit concernant des requêtes consécutives, vous devrez peut-être ajouter Utilities.sleep 的循环中使用 UrlFetchApp.fetch 而不是 UrlFetchApp.fetchAll avec
    • .

    Référence :
    • Comment autoriser l'accès à la fonction importrange via un script d'application ?
    • fetchAll (demande)
    🎜

    répondre
    0
  • Annulerrépondre