Najprostszy sposób na uzyskanie identyfikatora pliku z adresu URL w Google Apps Script

Oto, co próbuję zrobić: biorąc pod uwagę adres URL dokumentu Google, chcę uzyskać identyfikator dokumentu, aby utworzyć kopię na Dysku Google. Wiem, że mogę to osiągnąć przez wyrażenie regularne lub zastąpienie adresu URL, ale ponieważ istnieje kilka różnych form reprezentujących ten sam dokument w adresie URL, chciałem znaleźć ogólne rozwiązanie.

Obecnie, to najlepsze, co mogłem myśleć:

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);
}

Problem polega na tym, że moje rozwiązanie obejmuje tylko dokumenty i arkusze kalkulacyjne, chciałbym zrobić to samo z każdym przesłany plik, na przykład:

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

Krótko mówiąc, chciałem coś takiego:

DriveApp.getFileByUrl(url).makeCopy();
Czy ktoś wie czy to możliwe?

Każde bezpieczne rozwiązanie do wyodrębnienia identyfikatora pliku z adresu URL pliku pasowałoby również do mnie.

Dzięki

Author: Renato, 2013-05-30

4 answers

DriveApp rzeczywiście brakuje getFileByUrl (a także folderu w tej sprawie). Możesz otworzyć żądanie ulepszenia w aplikacji Apps Script issue tracker .

Ale to, co robię w moich skryptach (ponieważ te funkcje openByUrl są nieco nowe), to uzyskanie identyfikatora za pomocą wyrażenia regularnego. W ten sposób.

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

Ten regex działa dla dowolnego adresu URL google, który próbowałem: adres URL dysku dla folderów i plików, tabel Fusion, arkuszy kalkulacyjnych, dokumentów, prezentacji itp. Po prostu szuka czegokolwiek w sznurku, który " wygląda jak " klucz Google. Oznacza to, że każdy wystarczająco duży ciąg znaków, który ma tylko (klucz google) ważne znaki w nim.

Działa również, nawet jeśli otrzymuje identyfikator bezpośrednio, zamiast adresu URL. Co jest przydatne, gdy pytasz o link od użytkownika, ponieważ niektórzy mogą wkleić id bezpośrednio zamiast adresu url i nadal działa.

 44
Author: Henrique G. Abreu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-30 15:50:25

Adres URL jest podobny do tego, a Identyfikator pliku jest obecny we wzorze "/ D / XXXXXXXX / " dla prawie wszystkich linków GoogleDrive/Docs:
https://drive.google.com/file/d/0B3tB9BU9FRnpcTJmS2FoaktsQzA/view

Używając poniższej funkcji, możemy uzyskać'/ D / fileid/', a następnie obciąć '/ d / 'Od początku i' / ' od końca.

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
Author: aquadeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-03 07:33:42

Istnieje kilka rozszerzeń adresów URL nie opisanych powyżej, które mogą zawierać identyfikatory.

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

Pomyślałem, że dodam moje rozwiązanie, które opiera się na tej idei i obejmuje powyższe dwa rozszerzenia, a także te, które używają /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
Author: Jason Allshorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:21

Chciałem tylko dodać funkcję, którą stworzyłem na podstawie dwóch udzielonych odpowiedzi, ponieważ żadna z nich nie była dokładnie tym, czego szukałem.

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

To pobiera część po /d/ i aż do następnego /, co oznacza, że adresy URL dokumentów zawsze zawierają swoje identyfikatory. Jeśli nie znaleziono dopasowania dla tego, to po prostu zwracamy oryginalny param, który zakłada się jako ID.

 0
Author: Daniel Centore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 20:45:53