Permisos necesarios: https://www.googleapis.com/auth/spreadsheets

Nov 18 2020

Creé un código simple en Appscript para eliminar los nombres de archivo de Google Drive de la URL

function FileName (URL) {
  var ss = SpreadsheetApp.openByUrl(URL);
  return ss.getName();
}

Cuando ejecuto eso, aparece un error:

Excepción: no tiene permiso para llamar a SpreadsheetApp.openByUrl. Permisos requeridos:https://www.googleapis.com/auth/spreadsheets (linha 6).

Ya habilité Drive and Sheets API en el área de servicios avanzados de Google, por lo que "https://www.googleapis.com/auth/spreadsheets" debería estar bien, pero no lo es.

¿Cómo podría hacer que eso funcione?

He creado una hoja de muestra en este enlace con la replicación del problema.

Respuestas

2 Marios Nov 18 2020 at 15:29

Explicación del problema:

Estás utilizando una función personalizada.

Está muy bien explicado en la documentación oficial :

Si su función personalizada arroja el mensaje de error No tiene permiso para llamar al servicio X, el servicio requiere la autorización del usuario y, por lo tanto, no se puede utilizar en una función personalizada.

Como indica claramente el mensaje, no se le permite utilizar servicios que requieran autorización, como SpreadsheetApp.openByUrl(URL)dentro de una función personalizada.

También hay una tabla que señala particularmente que SpreadsheetApp.openByUrl(URL);no se puede utilizar dentro de una función personalizada:

Soluciones alternativas:

Puede utilizar funciones regulares de varias formas:

  1. Implementado como botones de menú personalizados,
  2. Ejecútelos desde el editor de scripts,
  3. Ejecútelos a través de simples activadores ,
  4. Crea un menú adicional, etc.

Versión de función regular de su script :

function FileName () {
  var URL = "spreadsheet_url"
  var ss = SpreadsheetApp.openByUrl(URL);
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  sheet.getRange('A1').setValue(ss.getName());
}

Tras la ejecución (ver captura de pantalla), este script establecerá el valor de la celda A1de Sheet1con el nombre del archivo de hoja de cálculo.

Te aconsejo que busques las funciones que utilicé en este script en la documentación oficial para ver qué hace cada una de ellas.

Actualizar:

Acabo de abrir su hoja y vi que está usando, SpreadsheetApp.openByUrl(URL);pero este método solo funciona para hojas de cálculo, de ahí el nombre de la clase SpreadsheetApp. Si desea abrir un ID de archivo, debe usar getFileById (id) . Veo que en la primera columna tiene URL de archivo, pero no hay un método para abrir un archivo por su URL. La identificación de un archivo como ese:

https://drive.google.com/file/d/1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp/view?usp=sharing

es:

1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp

Por lo tanto, necesita usar

var files = DriveApp.getFileById('1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp')

Un fragmento de código será así:

function FileName () {
  var URL = "1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp"
  var file = DriveApp.getFileById(URL);
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet1');
  sheet.getRange('B1').setValue(file.getName());
}

Familiarícese con GAS porque esta pregunta se acaba de convertir en una pregunta que necesita más atención.