tutorial script google findelement docs apps app google-apps-script

google-apps-script - findelement - google script file id



La forma más fácil de obtener el ID de archivo desde la URL en el script de Google Apps (5)

Esto es lo que estoy tratando de hacer: dada la URL de un documento de Google, quiero obtener la ID del documento para crear una copia en Google Drive. Sé que puedo lograrlo con alguna expresión regular o reemplazando en la URL, pero como hay varias formas diferentes para 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 así:

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ía bien.

Gracias


A DriveApp realmente 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 (ya que estas funciones openByUrl son algo nuevas), es obtener el ID utilizando 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: Unidad de URL para carpetas y archivos, tablas de fusión, hojas de cálculo, documentos, presentaciones, etc. Solo busca cualquier cosa en una cadena que "parece" 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 está solicitando el enlace del usuario, ya que algunos pueden pegar el ID directamente en lugar de la URL y aún funciona.


Hay algunas extensiones de URL más que no están cubiertas más arriba y 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; } }


La url es algo como esto y la identificación del 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 siguiente función, podemos obtener ''/ d / fileid /'' y luego truncar ''/ d /'' desde el principio 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(''/''); }


No tengo suficiente reputación como para comentar sobre la respuesta aceptada, pero la respuesta aceptada de Henrique G. Abreu falla cuando una URL de la unidad contiene el nombre de dominio y el nombre del dominio supera los 25 caracteres (simplemente lo encontré por la vía difícil :)

De lo contrario, ha sido muy confiable y creo que es el más elegante y robusto entre los que se proporcionan aquí.

Entonces, al expandir la respuesta aceptada, la siguiente expresión regular tendrá la última aparición de una cadena de caracteres de palabra o guiones de al menos 25 caracteres, que está precedida inmediatamente por un carácter que no es un carácter que no sea una palabra o un guión. , y seguido opcionalmente por el mismo tipo de personaje, y cualquier otra basura que pueda llegar al final:

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

Esto PIERDE la característica de la respuesta aceptada de que funcionará cuando se pase solo una identificación, sin embargo, no es un caso de uso que requiera. Funciona para todos los diferentes tipos de URL de Drive, Docs, Sheets para documentos y carpetas que he probado.


Solo quería agregar la función que creé basada en las dos respuestas dadas, porque ninguna de las dos 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 la siguiente / , que es como las URL de los documentos siempre contienen sus ID. Si no se encuentra una coincidencia para esto, simplemente devolvemos el parámetro original, que se supone que es el ID.