La forma más sencilla de obtener ID de archivo desde la URL en Google Apps Script

Esto es lo que trato de hacer: dada una URL de documento de Google, quiero obtener la ID del documento para crear una copia en Google Drive. Sé que puedo lograrlo mediante algunos regex o reemplazando en la URL, pero como hay varias formas diferentes de representar el mismo documento en una URL, quería encontrar una solución genérica.

Actualmente, eso es lo mejor que pude pensar:

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

El problema es que mi solución solo cubre documentos y hojas de cálculo, me gustaría hacer lo mismo con cualquier archivo cargado, por ejemplo:

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

En resumen, quería algo como eso:

 DriveApp.getFileByUrl(url).makeCopy(); 

¿Alguien sabe si es posible?

Cualquier solución segura para extraer el ID de archivo de la URL del archivo también me quedará bien.

Gracias

A DriveApp le falta un getFileByUrl (y también una carpeta). Es posible que desee abrir una solicitud de mejora en el rastreador de problemas de Apps Script .

Pero lo que hago en mis scripts (dado que estas funciones de openByUrl son algo nuevas), es obtener el id con una expresión regular. Me gusta esto.

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

Esta expresión regular funciona para cualquier url de google que he probado: Drive url para carpetas y archivos, Fusion Tables, Spreadsheets, Docs, Presentations, etc. Simplemente busca cualquier cosa en una cadena que “se parece” a una clave de Google. Es decir, cualquier cadena lo suficientemente grande que solo tenga caracteres válidos (clave de Google).

Además, funciona incluso si recibe la ID directamente, en lugar de la URL. Lo cual es útil cuando le pides el enlace al usuario, ya que algunos pueden pegar el ID directamente en lugar de la URL y aún funciona.

La URL es algo así y el ID de archivo está presente en este patrón “/ d / XXXXXXXX /” para casi todos los enlaces de GoogleDrive / Docs:
https://drive.google.com/file/d/0B3tB9BU9FRnpcTJmS2FoaktsQzA/view

Usando la función de abajo, podemos obtener ‘/ d / fileid /’ y luego truncar ‘/ d /’ desde el inicio y ‘/’ desde el final.

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

Hay algunas más extensiones de URL no cubiertas anteriormente que pueden contener ID.

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

Pensé que agregaría mi solución que se basa en esta idea , y cubre las dos extensiones anteriores, así como las que usan / 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; } } 

Solo quería agregar la función que creé en base a las dos respuestas dadas, porque tampoco era exactamente lo que estaba buscando.

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

Esto obtiene la parte después de /d/ y hasta el siguiente / , que es como las URL del documento siempre contienen sus ID. Si no se encuentra una coincidencia para esto, simplemente devolvemos el param original, que se supone que es el ID.