Gestion des partages via un script et un fichier sheet

Bonjour,

Je partage des fichiers avec pas mal de destinataires : j'ai un script qui me permet de récupérer les URL des fichiers à partager.
Je me demandais s'il était possible d'automatiser la gestion des partages, via un script sans doute, qui vient récupérer dans une colonne du fichier les adresses mail par type de partage (éditeur, commentateur, lecteur). Dans l'idéal, plusieurs personnes peuvent avoir le même type de partage (donc plusieurs adresses mail dans la cellule) mais sinon je peux m'en affranchir.
Le fichier pour comprendre ma demande : https://docs.google.com/spreadsheets/d/1St90iAlwDKAJIkXSYbQIlfphjqa9Ehi79EQFFERYXBA/edit?usp=sharing

Bonjour,

Quelque chose de ce style :

function partagerFichiers() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Feuille1");
  var data = sheet.getDataRange().getValues();
  for (i =1;i<= data.length; i++) {
    var fichierUrl = data[i][0];
    var destinataireEd = data[i][1].split(";");
    var destinataireCom = data[i][2].split(";");
    var destinataireLec = data[i][3].split(";");
    try {
      var fichier = DriveApp.getFileByUrl(fichierUrl);
      destinataireEd.forEach(function(mail){fichier.addEditor(mail);});
      destinataireCom.forEach(function(mail){fichier.addCommenter(mail);});
      destinataireLec.forEach(function(mail){fichier.addViewer(mail);});
    } catch (error) {
      console.log("Erreur lors de la récupération du fichier pour l'url: " + fichierUrl);
      console.log("Erreur :" + error.message);
    }
  }
}

Bonjour,

Merci pour ton retour.

Le code me renvoie une erreur sur la ligne

var fichier = DriveApp.getFileByUrl(fichierUrl);

en m'indiquant que DriveApp.getFileByUrl n'est pas une fonction : j'ai cherché dans la documentation et je ne trouve effectivement pas trace de cette fonction.

En effet, on est obligé de passer par l'ID, est ce que ceci règle le problème ?

function partagerFichiers() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("Feuille1");
  var data = sheet.getDataRange().getValues();
  for (i =1;i<= data.length; i++) {
    var fichierUrl = data[i][0];
    var destinataireEd = data[i][1].split(";");
    var destinataireCom = data[i][2].split(";");
    var destinataireLec = data[i][3].split(";");
    try {
      var fichierId = fichierUrl.replace(/.*\/d\//, '').replace(/\/.*/,  '');
      var fichier = DriveApp.getFileById(fichierId);
      destinataireEd.forEach(function(mail){fichier.addEditor(mail);});
      destinataireCom.forEach(function(mail){fichier.addCommenter(mail);});
      destinataireLec.forEach(function(mail){fichier.addViewer(mail);});
    } catch (error) {
      console.log("Erreur lors de la récupération du fichier pour l'url: " + fichierUrl);
      console.log("Erreur :" + error.message);
    }
  }
}

Cela fonctionne nickel lorsque je ne mets qu'un seul destinataire par cellule.

J'obtiens systématiquement une erreur (TypeError: Cannot read properties of undefined (reading '0')) pour la ligne var fichierUrl = data[i][0];

Mais c'est sans conséquence car je reçois bien les notifications avec les bons droits pour chaque adresse.

Par contre, si j'essaye de mettre deux adresses dans une même cellule (en les séparant bien par " ; " pour la fonction split), j'ai un message d'erreur : Invalid argument: permission.value
Pourtant, quand j'affiche le log de ce qui est enregistré, j'ai bien les 2 adresses mail qui apparaissent.

Ah bon

Car j'ai mis un split permettant de stocker plusieurs adresses mails, séparés par des " ; " à cet endroit :

    var destinataireEd = data[i][1].split(";");
    var destinataireCom = data[i][2].split(";");
    var destinataireLec = data[i][3].split(";");

Édit : J'ai testé en il semblait y avoir un soucis avec la split sur des données vides + le soucis est peut être liée au espaces, voici une version corrigée avec nettoyage des adresses mail + de multiples vérifications :

function partagerFichiers() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Feuille1");
  let data = sheet.getDataRange().getValues();
  let fichierUrl, destinataireEd, destinataireCom, destinataireLec;
  for (i=1;i<=data.length;i++) {
    if (data[i].length > 1 && data[i][0] !== "") {
      fichierUrl = data[i][0];}
    if (data[i].length > 1 && data[i][1] !== "") {
      destinataireEd = data[i][1].split(";").map(function(item) { return item.trim(); });}
    if (data[i].length > 1 && data[i][2] !== "") {
      destinataireCom = data[i][2].split(";").map(function(item) { return item.trim(); });}
    if (data[i].length > 1 && data[i][3] !== "") {
      destinataireLec = data[i][3].split(";").map(function(item) { return item.trim(); });}

    try {
      let fichierId = fichierUrl.replace(/.*\/d\//, '').replace(/\/.*/, '');
      let fichier = DriveApp.getFileById(fichierId);
      destinataireEd.forEach(function(mail) { fichier.addEditor(mail); });
      destinataireCom.forEach(function(mail) { fichier.addCommenter(mail); });
      destinataireLec.forEach(function(mail) { fichier.addViewer(mail); });
    } catch (error) {
      Logger.log("Erreur lors de la récupération du fichier pour l'url: " + fichierUrl);
      Logger.log("Erreur :" + error.message);
    }
  }
}

La mise à jour des droits fonctionne toujours même si j'obtiens un message d'erreur

TypeError: Cannot read properties of undefined (reading 'length')
partagerFichiers    @ Code.gs:7

Est-ce que tu sais s'il y a un moyen de bloquer l'envoi automatique du mail de notification ?

Rechercher des sujets similaires à "gestion partages via script fichier sheet"