Необходимые разрешения: https://www.googleapis.com/auth/spreadsheets

Nov 18 2020

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

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

Когда я запускаю это, я получаю сообщение об ошибке:

Исключение: у вас нет разрешения на вызов SpreadsheetApp.openByUrl. Необходимые разрешения:https://www.googleapis.com/auth/spreadsheets (Линха 6).

Я уже включил Drive and Sheets API в области Advanced Google Services, так что https://www.googleapis.com/auth/spreadsheets должно быть в порядке, но это не так.

Как я мог заставить это работать?

Я создал образец листа по этой ссылке с репликацией проблемы.

Ответы

2 Marios Nov 18 2020 at 15:29

Объяснение проблемы:

Вы используете настраиваемую функцию.

Это очень хорошо объяснено в официальной документации :

Если ваша настраиваемая функция выдает сообщение об ошибке. У вас нет разрешения на вызов службы X., служба требует авторизации пользователя и поэтому не может использоваться в настраиваемой функции.

Как четко указано в сообщении, вам не разрешается использовать службы, требующие авторизации, например, в SpreadsheetApp.openByUrl(URL)рамках настраиваемой функции.

Также есть таблица, в которой особо указывается, что SpreadsheetApp.openByUrl(URL);нельзя использовать в пользовательской функции:

Обходные пути:

Вы можете использовать обычные функции несколькими способами:

  1. Реализовано как пользовательские кнопки меню,
  2. Выполните их из редактора скриптов,
  3. Выполнять их с помощью простых триггеров ,
  4. Создайте дополнительное меню и т. Д.

Стандартная функциональная версия вашего скрипта :

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

После выполнения (скриншот см), этот сценарий будет установить значение ячейки A1из Sheet1имени файла электронной таблицы.

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

Обновить:

Я только что открыл вашу таблицу и увидел, что вы используете, SpreadsheetApp.openByUrl(URL);но этот метод работает только для электронных таблиц, отсюда и название класса SpreadsheetApp. Если вы хотите открыть идентификатор файла, вам нужно использовать getFileById (id) . Я вижу, что в первом столбце у вас есть URL-адреса файлов, но нет способа открыть файл по его URL-адресу. Идентификатор из такого файла:

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

является:

1d-2L5kGZWbUa_p7iLgBBa59QqZiyIhgp

Поэтому вам нужно использовать

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

Фрагмент кода будет таким:

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

Пожалуйста, ознакомьтесь с GAS, потому что этот вопрос стал вопросом, требующим более пристального внимания.