web-dev-qa-db-fra.com

Meilleure façon d'obtenir l'ID de fichier à partir d'une URL dans le script Google Apps

Voici ce que j'essaie de faire: avec l'URL d'un document Google, je souhaite obtenir l'ID du document pour en créer une copie sur Google Drive. Je sais que je peux y parvenir en utilisant des expressions rationnelles ou en remplaçant l’URL, mais comme il existe plusieurs formulaires différents pour représenter le même document dans une URL, je voulais trouver une solution générique.

Actuellement, c'est le mieux que je puisse penser:

function getFileIdFromUrl(url) {
  try {
    return getDocIdFromUrl(url);
  } catch (e) {
    return getSpreadsheetIdFromUrl(url);
  }
}

function getDocIdFromUrl(url) {
  var doc = null;
  try {
    doc = DocumentApp.openByUrl(url);
  } catch (e) {
    doc = DocumentApp.openByUrl(url + "/edit");
  }
  return doc.getId();
}

function getSpreadsheetIdFromUrl(url) {
  var spreadsheet = null;
  try {
    spreadsheet = SpreadsheetApp.openByUrl(url);
  } catch (e) {
    spreadsheet = SpreadsheetApp.openByUrl(url + "/edit");
  }
  return spreadsheet.getId();
}

function copy(url) { // may throw an exception if the URL is invalid or private
   var id = getFileIdFromUrl(url);
   var file = DriveApp.getFileById(id);
   file.makeCopy().setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
}

Le problème est que ma solution ne couvre que les documents et les feuilles de calcul. J'aimerais faire la même chose avec n'importe quel fichier téléchargé, par exemple:

https://docs.google.com/file/d/0B-FYu_D7D7x4REdtRVEzVH0eU0/edit

En bref, je voulais quelque chose comme ça:

DriveApp.getFileByUrl(url).makeCopy();

Est-ce que quelqu'un sait si c'est possible?

Toute solution sûre permettant d’extraire l’ID de fichier à partir de l’URL du fichier me conviendrait également.

Merci

20
Renato

DriveApp manque en effet une getFileByUrl (et aussi un dossier). Vous souhaiterez peut-être ouvrir une demande d’amélioration sur Outil de suivi des problèmes de script Apps .

Mais ce que je fais sur mes scripts (puisque ces fonctions openByUrl sont quelque peu nouvelles), est d’obtenir l’id à l’aide d’une expression régulière. Comme ça.

function getIdFromUrl(url) { return url.match(/[-\w]{25,}/); }

Cette expression rationnelle fonctionne pour toutes les URL google que j'ai essayées: URL du lecteur pour les dossiers et les fichiers, les tables Fusion, les feuilles de calcul, les documents, les présentations, etc. C'est-à-dire que toute chaîne assez grosse qui ne contient que des caractères valides (clé Google).

En outre, cela fonctionne même s'il reçoit l'ID directement, au lieu de l'URL. Ce qui est utile lorsque vous demandez le lien de l'utilisateur, car certains peuvent coller l'ID directement à la place de l'URL et cela fonctionne toujours.

48

L'URL ressemble à ceci et l'identifiant de fichier est présent dans ce modèle "/ d/XXXXXXXX /" pour presque tous les liens GoogleDrive/Docs:
https://drive.google.com/file/d/0B3tB9BU9FRnpcTJmS2FoaktsQzA/view

En utilisant la fonction ci-dessous, nous pouvons obtenir le '/ d/fileid /' et ensuite tronquer '/ d /' à partir du début et '/' à la fin.

public static string getIdFromUrl(string url)
{
    Regex r = new Regex(@"\/d\/(.+)\/", RegexOptions.IgnoreCase);
    Match m = r.Match(url);
    return m.ToString().TrimStart('/', 'd').Trim('/');
}
3
aquadeep

Je n'ai pas assez de réputation pour commenter la réponse acceptée, mais la réponse acceptée de Henrique G. Abreu échoue lorsqu'une URL de lecteur contient le nom de domaine et que le nom de domaine dépasse 25 caractères (je viens de le découvrir à la dure :)

Il a été très fiable autrement et je pense est le plus élégant et le plus robuste parmi ceux fournis ici.

Ainsi, en développant la réponse acceptée, l'expression rationnelle suivante obtiendra la dernière occurrence d'une chaîne de caractères Word ou de traits d'union d'au moins 25 caractères, immédiatement précédée d'un caractère autre que Word ou un trait d'union. , et suivi éventuellement du même type de caractère, et de tout autre indésirable qui pourrait venir à la fin:

/.*[^-\w]([-\w]{25,})[^-\w]?.*/

Cela perd la caractéristique de la réponse acceptée, à savoir que cela ne fonctionnera que si un identifiant est transmis, mais ce n'est pas un cas d'utilisation dont j'ai besoin. Cela fonctionne pour tous les différents types d'URL de lecteur, de documents et de feuilles pour les documents et les dossiers que j'ai testés.

1
Iain Dooley

Certaines extensions d’URL non couvertes ci-dessus peuvent contenir des identifiants. 

https://drive.google.com/drive/folders/ et https://drive.google.com/open?id= et https://drive.google.com/a/domain.edu.vn/folderview?id=

J'ai pensé ajouter ma solution qui repose sur cette idée , et couvre les deux extensions ci-dessus, ainsi que celles utilisant/d /

function getIdFrom(url) {
  var id = "";
  var parts = url.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/);
  if (url.indexOf('?id=') >= 0){
     id = (parts[6].split("=")[1]).replace("&usp","");
     return id;
   } else {
   id = parts[5].split("/");
   //Using sort to get the id as it is the longest element. 
   var sortArr = id.sort(function(a,b){return b.length - a.length});
   id = sortArr[0];
   return id;
   }
 }
1
Jason Allshorn

Je voulais juste ajouter la fonction que j'ai créée en fonction des deux réponses données, car ni l'une ni l'autre n'était tout à fait ce que je cherchais.

function templateIdFrom(url) {
  var parts = url.match(/\/d\/(.+)\//);
  if (parts == null || parts.length < 2) {
    return url;
  } else {
    return parts[1];
  }
}

Cela obtient la partie après /d/ et jusqu’au prochain /, ce qui explique comment les URL de document contiennent toujours leurs identifiants. Si aucune correspondance n'est trouvée pour cela, nous renvoyons simplement le paramètre d'origine, qui est supposé être l'ID.

0
Daniel Centore