Самый простой способ получить идентификатор файла из URL-адреса в Google Apps Script

Вот что я пытаюсь сделать: с учетом URL-адреса Google, я хочу получить идентификатор документа для создания копии на Google Диске. Я знаю, что могу добиться этого с помощью некоторого регулярного выражения или заменить URL-адрес, но поскольку есть несколько разных форм для представления одного и того же документа в URL-адресе, я хотел найти общее решение.

В настоящее время это лучшее, что я мог подумать:

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

Проблема в том, что мое решение охватывает только документы и электронные таблицы, я хотел бы сделать то же самое с любым загруженным файлом, например:

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

Короче говоря, я хотел что-то вроде этого:

DriveApp.getFileByUrl(url).makeCopy();

Кто-нибудь знает, возможно ли это?

Любое безопасное решение для извлечения идентификатора файла из URL-адреса файла также подходит для меня.

Спасибо

Ответ 1

DriveApp действительно отсутствует getFileByUrl (а также папка в этом отношении). Возможно, вы захотите открыть запрос на улучшение в трекере скриптов приложений.

Но что я делаю в своих скриптах (поскольку эти функции openByUrl несколько новы), так это в получении идентификатора с помощью регулярных выражений. Вот так.

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

Это регулярное выражение работает для любого URL-адреса Google, который я пробовал: URL-адрес диска для папок и файлов, таблиц Fusion, электронных таблиц, документов, презентаций и т.д. Он просто ищет все в строке, которая "похожа" на ключ Google. То есть любая достаточно большая строка, содержащая только (ключ Google) допустимые символы.

Кроме того, он работает, даже если он получает идентификатор напрямую, а не URL. Это полезно, когда вы запрашиваете у пользователя ссылку, поскольку некоторые могут вставить идентификатор вместо URL-адреса, и он все еще работает.

--edit

Есть некоторые другие ответы и комментарии, которые касаются некоторых крайних случаев, с которыми я никогда не сталкивался, но может случиться, например, попытка получить идентификатор папки по URL-адресу вложенной папки, или когда у вас есть домен G-Suite длиной 25+ символов, В этих случаях вы можете использовать более строгое регулярное выражение.

Кратко рассмотрев приведенные ниже предложения, я рекомендую следующее /[-\w]{25,}$/, поскольку оно все еще очень просто и должно учитывать эти случаи.

Ответ 2

URL-адрес подобен этому, и идентификатор файла присутствует в этом шаблоне "/d/XXXXXXXX/" для почти всех ссылок GoogleDrive/Docs:
https://drive.google.com/file/d/0B3tB9BU9FRnpcTJmS2FoaktsQzA/view

Используя нижеприведенную функцию, мы можем получить '/d/fileid/', а затем усечь '/d/' с начала и '/' с конца.

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

У меня недостаточно репутации, чтобы комментировать принятый ответ, но принятый ответ от Henrique G. Abreu не удается, когда URL-адрес диска содержит доменное имя, а доменное имя превышает 25 символов (только что выяснил это трудным путем :)

В противном случае он был очень надежным, и я думаю, что он самый элегантный и надежный среди представленных здесь.

Итак, расширив принятый ответ, следующее регулярное выражение получит последнее вхождение строки символов или дефисов из слов длиной не менее 25 символов, которой непосредственно предшествует символ, не являющийся символом без слов или дефисом. и, возможно, за ним следует тот же тип персонажа и любой другой мусор, который может появиться в конце:

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

Это ПОТЕРЯЕТ характеристику принятого ответа, что он будет работать только после передачи идентификатора, однако это не тот случай использования, который мне требуется. Он работает для всех различных типов URL-адресов дисков, документов, листов как для документов, так и для папок, которые я тестировал.

Ответ 4

Есть еще несколько расширений URL, не указанных выше, которые могут содержать идентификаторы.

https://drive.google.com/drive/folders/  а также  https://drive.google.com/open?id=  а также  https://drive.google.com/a/domain.edu.vn/folderview?id=

Я думал, что добавлю свое решение, основанное на этой идее, и рассмотрит вышеупомянутые два расширения, а также те, которые используют /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;
   }
 }

Ответ 5

Я просто хотел добавить функцию, созданную мной на основе двух заданных ответов, потому что ни один из них не был тем, что я искал.

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

Это получает часть после /d/ и до следующего /, так как URL-адреса документа всегда содержат свои идентификаторы. Если для этого не найдено совпадения, мы просто возвращаем исходный параметр, который считается идентификатором.

Ответ 6

Метод openByUrl теперь доступен в скрипте Google Apps.

См. справочные документы здесь для листов, здесь для документов, здесь для слайдов и здесь для форм.

Потому что вы написали:

Я хочу получить идентификатор документа для создания копии на Google Диске

... Я полагаю, вам не нужно удостоверение личности как таковое. Получив лист/документ/слайд/форму по URL, вы можете сделать его копию.