Как получить URL файла из имени файла в Google Sheets с правильной Авторизацией через пользовательскую функцию / скрипт - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы создать пользовательскую функцию, которая извлекает URL-адрес диска из имени файла в Google Sheets.

Итак, используя следующий код:

  1. Если у меня естьдопустимое имя файла в ячейке A1
  2. Функция =getFile(A1) вернет URL

    • Когда я запускаю свой скрипт из редактора скриптов, возвращаемое значение работает.
    • Когда я запускаю функцию getFile() из моего листа, я получаю ошибку ниже.

Мой код:

function getFile(cell) {

  var filename = encodeURI(cell);

  var url = "https://www.googleapis.com/drive/v3/files?fields=files(id,name)&q=name+contains+'" + filename + "' and trashed=false";
  var params = {
    method: "GET",
    headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions: true
  };
  var res = UrlFetchApp.fetch(url, params).getContentText();
  var json = JSON.parse(res);
  return res; // outputs response below
  if(json){
    var objFiles = json.files[0];
    var fileID = objFiles.id
    var resURL = "https://docs.google.com/spreadsheets/d/" + fileID;
    Logger.log(resURL);
    //return resURL; // only works when run within script editor
  }

}

Ошибка:

"{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "authError",
    "message": "Invalid Credentials",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Invalid Credentials"
 }
}
"

Я предполагаю, что что-то не так с моим токеном аутентификации.Может кто-нибудь направить меня к решению этого?Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

@ I '-' I ' ответ правильный.Хотя я не уверен, что вы этого хотите, как насчет этого обходного пути?Я также испытал ту же проблему.В то время я использовал следующий обходной путь.

  • Установите и получите токен доступа с помощью PropertiesService.

Поток выглядит следующим образом.

Поток:

  1. Устанавливать токен доступа каждые 1 час с помощью временного триггера.
    • При этом токен доступа обновляется каждые 1 час.Поскольку срок действия токена доступа составляет 1 час.
  2. Когда пользовательская функция запускается, она получает токен доступа с помощью PropertiesService.
    • При этом можно использовать токен доступа.

Модифицированный скрипт:

Пожалуйста, установите эту функцию как управляемый по времени триггер,Конечно, вы можете запустить эту функцию вручную.

function setAccessToken() {
  PropertiesService.getScriptProperties().setProperty("accessToken", ScriptApp.getOAuthToken());
}

В вашем скрипте измените его следующим образом.

С:
var params = {
  method: "GET",
  headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
  muteHttpExceptions: true
};
Кому:
var params = {
  method: "GET",
  headers: {"Authorization": "Bearer " + PropertiesService.getScriptProperties().getProperty("accessToken")},
  muteHttpExceptions: true
};

Примечание:

  • В этом случае владелец токена доступа является владельцем проекта.
  • Я думаю, что это может также использоваться CacheService.

Ссылка:

0 голосов
/ 14 октября 2018

Это может быть решением для некоторых потребностей.

Моя особая потребность заключалась в том, чтобы: пройтись по столбцу имен файлов и вытащить URL-адрес Документов Google с установленным интервалом.Код ниже просто перебирает имена файлов в "Column A" из "My Sheet" и возвращает значение в соседнюю ячейку "Column B" (начиная со строки 2, потому что у меня были заголовки столбцов).Я не беспокоюсь о безопасности, потому что я ссылаюсь только на внутренние файлы организации.

Чтобы код ниже работал, вам нужно:

  1. Google Sheet Doc Nav> Инструменты>Редактор сценариев
  2. Создайте файл .gs и введите код ниже (Ссылка на соответствующий лист
  3. В редакторе сценариев> Правка> Триггеры текущего проекта> Назовите свой проект
  4. В редакторе сценариев> Изменить> Триггеры текущего проекта> Нажмите на модальную ссылку «Триггеры не настроены. Нажмите здесь, чтобы добавить один сейчас»> Установите свой временной триггер (ссылка replaceFileColumn в поле выбора в этом модальном)

Моя ошибка заключалась в том, что я думал, что для этого мне нужно использовать настраиваемую функцию в каждой ячейке (я до сих пор не до конца понимаю причины, почему это не сработает, так что если кто-то может объяснить это непрофессионалам)термины, которые были бы невероятны; мое решение - просто обходной путь ради целесообразности).

В моей таблице есть триггер, управляемый временем , вызывающий replaceFileColumn()

Надеюсь, это кому-нибудь поможет!

function getMyFile(cell) {
  var filename = encodeURI(cell);
  var files = DriveApp.getFilesByName(cell);
  while (files.hasNext()) {
    var file = files.next();
    if(file){
      var fileValue = file.getUrl();
      return(fileValue);
    };
  };
}

function replaceFileColumn() {
  var spreadsheet = SpreadsheetApp.getActive().getSheetByName('My Sheet');
  var range = spreadsheet.getRange("A2:A");
  var range_update = spreadsheet.getRange("B2:B");
  var values = range.getValues();
  for (var i = 0; i < values.length; i++) {
    var fileName = values[i];
    var getFileUrl = getMyFile(fileName);
    values[i][0] = getFileUrl;
  }
  range_update.setValues(values);
}
0 голосов
/ 12 октября 2018

Пользовательские функции выполняются так, как если бы они выполнялись анонимным животным (пользователем).ScriptApp.getOAuthToken вернет анонимный токен без необходимых областей.То, что вы пытаетесь сделать, невозможно, если файл не является общедоступным.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...