web-dev-qa-db-fra.com

Fonction personnalisée Google feuilles pour tester si un document Google est partagé avec moi

J'essaie de savoir si un document Google est partagé avec moi avant de l'ouvrir. Je collecte les travaux des étudiants via un formulaire Google et je souhaite ajouter une fonction à la feuille de calcul des réponses qui me dit "si" le document est partagé avec moi. Est-ce possible?

J'ai essayé le suivant, mais je ne pouvais pas le faire fonctionner. De plus, si cela fonctionne, il ne me dit que "si" il a des éditeurs, pas si le document a moi en tant qu'éditeur.

function isShared(){
  var editors = DriveApp.getFileById().getEditors()
  if(editors.length > 0){
    return true
  }
  return false 
}

Document cible

démo

Les identifiants de documents sont dans la colonne G et j'aimerais que "vrai" ou "faux" soit affiché dans la colonne H.

4
Mr. B

Réponse courte

  1. DriveApp ne peut pas être utilisé dans une fonction personnalisée car il nécessite une autorisation pour accéder aux fichiers1, exécutez donc le script à partir de l’éditeur de script ou d’un menu personnalisé.
  2. Si un fichier n'est pas partagé avec vous, getFileById renverra une erreur, il n'est donc pas nécessaire de vérifier toute autre propriété de fichier.
  3. D'un côté, le script Google Apps est limité à 6 minutes. Si vous avez plusieurs identifiants de fichiers, il est possible que vous deviez exécuter le script par sous-ensembles.

1: https://developers.google.com/apps-script/guides/sheets/functions#using_apps_script_services

Explication

De https://developers.google.com/apps-script/reference/drive/drive-app#getfilebyidid

getFileById (id)

Obtient le fichier avec l'ID donné. Lève une exception de script si le fichier n'existe pas ou si l'utilisateur n'a pas la permission d'y accéder.

Code

Exécutez myFunction à partir de l'éditeur de script ou à l'aide d'un menu personnalisé.

function myFunction(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Period6');
  var range = sheet.getRange('G2:G20'); //Gets the file's ID range
  var output = SHAREDWITHME(range.getValues()); //Checks each value on the selected range
  //Sets the results to the right of the selected range
  range.offset(0, 1).setValues(output); 
}
/**
 * Check files IDs are from files shared with me
 *
 * @param {A1:A5} input The range with file IDs.
 * @return TRUE or FALSE
 * 
 */

function SHAREDWITHME(input) {
  if (input.map) {            // Test whether input is an array.
    return input.map(SHAREDWITHME) // Recurse over array if so.
  } else {
    try {
      var file = DriveApp.getFileById(input);
      return 'TRUE'
    } catch(e) {
      return 'FALSE';
    }
  }
}
1
Rubén