Permissões necessárias: https://www.googleapis.com/auth/spreadsheets

Nov 18 2020

Eu criei um código simples no appscript para obter os nomes dos arquivos do Google Drive fora do URL

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

Quando o executo, obtenho um erro:

Exceção: você não tem permissão para chamar SpreadsheetApp.openByUrl. Permissões necessárias:https://www.googleapis.com/auth/spreadsheets (linha 6).

Já habilitei o Drive and Sheets API na área de serviços avançados do Google, então "https://www.googleapis.com/auth/spreadsheets" deve estar ok, mas não está.

Como eu poderia fazer isso funcionar?

Criei uma planilha de amostra neste link com a replicação do problema.

Respostas

2 Marios Nov 18 2020 at 15:29

Explicação do problema:

Você está usando uma função personalizada.

Está muito bem explicado na documentação oficial :

Se sua função personalizada gerar a mensagem de erro Você não tem permissão para chamar o serviço X., O serviço requer autorização do usuário e, portanto, não pode ser usado em uma função personalizada.

Como a mensagem afirma claramente, você não tem permissão para usar serviços que requerem autorização, como SpreadsheetApp.openByUrl(URL)em uma função personalizada.

Há também uma tabela que aponta particularmente que SpreadsheetApp.openByUrl(URL);não pode ser usada em uma função personalizada:

Soluções alternativas:

Você pode usar funções regulares de várias maneiras:

  1. Implementado como botões de menu personalizados,
  2. Execute-os a partir do editor de script,
  3. Execute-os por meio de gatilhos simples ,
  4. Crie um menu adicional etc.

Versão da função regular do seu script :

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

Após a execução (veja a imagem), este script definirá o valor da célula A1de Sheet1para o nome do arquivo da planilha.

Aconselho você a procurar as funções que usei neste script na documentação oficial para ver o que cada uma delas faz.

Atualizar:

Acabei de abrir sua planilha e vi que você está usando, SpreadsheetApp.openByUrl(URL);mas este método funciona apenas para planilhas, daí o nome da classe SpreadsheetApp. Se você deseja abrir um ID de arquivo, você precisa usar getFileById (id) . Vejo na primeira coluna que você tem URLs de arquivo, mas não há um método para abrir um arquivo por seu URL. O id de um arquivo como este:

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

é:

1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp

Portanto, você precisa usar

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

Um snippet de código será assim:

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

Familiarize-se com o GAS porque esta questão acabou de se tornar uma questão que precisa de mais foco.