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

Вот что я пытаюсь сделать: учитывая 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 файла подойдет мне.

Спасибо

12 ответов

Решение

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

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

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

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

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

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('/');
}

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

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

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

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

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

An openByUrl теперь доступен в Google Apps Script.

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

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

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

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

Есть еще несколько расширений 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;
   }
 }

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

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

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

Решение, предложенное Энрике, может не охватывать сценарий, когда файл Google Диска используется совместно пользователем Google Workspace, где домен может быть частью URL-адреса файла. Если имя домена длинное, имя домена захватывается вместо URL-адреса файла.

      https://drive.google.com/a/thisisaverylongdomainname.org/file/d/1djf7XfuKx4Px55x7ahvMa5uznp3Ibe5vd7Y/view?usp=sharing

Идентификаторы файлов, сгенерированные Google Диском, не содержат точки (.), Поэтому измененное регулярное выражение может предотвратить захват доменных имен.

      function getFileIdFromDriveUrl(url) {
  var match = url.match(/([a-z0-9_-]{25,})[$/&?]/i);
  return match ? match[1] : null;
}

У меня есть лист, на котором я помещаю URL-адрес в ячейку и вытаскиваю его из сценария приложения, чтобы сделать что-то еще (например, создание документов внутри папки с содержимым из листа)

Я просто использовал простое разделение ('/'), чтобы вытащить из него идентификатор

иногда, если URL-адрес включает / u / 0 /, просто сдвиньте немного вниз по индексу

      if(sheet.getRange("D2").getValue().split("/")[4]==="u"){
  folderId = 
sheet.getRange("D2").getValue().split("/")[7];
}else{
folderId = 
sheet.getRange("D2").getValue().split("/")[5];
}

хотя он работает только с двумя заданными форматами дисков Google. я не встречал много других, кроме drive.google.com/drive/folders/#folderId и drive.google.com/drive/u/o/folders/#folderId, но это большинство, с которыми мы сталкиваемся

Я буду пробовать регулярные выражения, и мне определенно нужно узнать об этом больше.

Для Python:

Для идентификаторов дисков Google фиксированной длины вы можете использовать это:

regex = "([\w-]){33}|([\w-]){19}"
match = re.search(regex,url)

Диск Google использует 33 символа для обычных дисков и 19 символов для общих дисков.

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

regex = "(?<=/folders/)([\w-]+)|(?<=%2Ffolders%2F)([\w-]+)|(?<=/file/d/)([\w-]+)|(?<=%2Ffile%2Fd%2F)([\w-]+)|(?<=id=)([\w-]+)|(?<=id%3D)([\w-]+)"

match = re.search(regex,url)

Как насчет сценария Google Apps для преобразования URL-адреса диска Google в идентификатор?

Чтобы извлечь идентификатор из таблиц URL, я использую приведенный ниже код. Он работает с таблицей Google и Excel на Диске. Возможно, работает и с другими документами.

function getIdSheetFromUrl_(url)
{
    var id = url.split('id=')[1];
    if(!id)
    {
        id = url.split('/d/')[1];
        id = id.split('/edit')[0]; // here we have the id
    }
    return DriveApp.getFileById(id);
}

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

=mid({cellAddress},33,33)

Пример:

= середина (A2,33,33)

Другие вопросы по тегам