Получить значения для всех листов в электронной таблице Google для определенной ревизии - PullRequest
1 голос
/ 20 мая 2019

Это электронная таблица образца с 2 листами (Лист1 и Лист2).Значения ячейки: 1) [["This", "is", "first", "sheet"], ["Добавлена ​​строка 2", "", "", ""]] для Sheet1 2) [["This"," is "," second "," sheet "], [" Добавлена ​​строка 2 "," "," "," "]]] для Sheet2

Когда я запускаю следующий код,

var file_id = '1JqbuqOQS5NSFqfPlxJG-DY1HIW9xZl_ddjQa_F2pUv4';
var revisions = Drive.Revisions.list(file_id);
var revision = revisions.items[revisions.items.length-1];

var revUrl = Drive.Revisions.get(file_id, revision.id).exportLinks["text/csv"]  + "&access_token=" + ScriptApp.getOAuthToken();

var revString = UrlFetchApp.fetch(revUrl).getContentText();

Я получаю только revString = "Это, во-первых, лист \ nДобавленная строка 2 ,,,"

Как получить значения второго листа?

1 Ответ

0 голосов
/ 20 мая 2019
  • Вы хотите получить последнюю версию.
    • Это от var revision = revisions.items[revisions.items.length-1].
    • Вы также хотите получить данные CSV из других ревизий.
  • Вы хотите получить данные CSV со всех листов для определенной ревизии.
  • Вы хотите использовать скрипт Google Apps.

Если мое понимание верно, как насчет этого ответа?

Проблема:

К сожалению, данные CSV со всех листов не могут быть получены из revUrl вашего сценария. Конечная точка по умолчанию exportLinks["text/csv"] указывает на 1-й тег таблицы. Если вы хотите получить другие листы, необходимо добавить параметр запроса gid={sheetId} для каждого листа.

И на текущем этапе прямой доступ к ревизии Spreadsheet of ceatain с помощью Spreadsheet Service и Sheets API невозможно. Поэтому, когда данные CSV извлекаются из данных редакции, если существующие листы уже были удалены и / или новые листы уже добавлены, все идентификаторы листов не могут быть извлечены.

Обходной путь 1:

Этот обходной путь предполагает условие удаления и добавления листов в электронную таблицу.

В этой модификации я использовал следующий поток.

  1. Извлечение данных XLSX из электронной таблицы определенной ревизии.
  2. Преобразование данных XLSX в электронную таблицу Google в виде временной таблицы.
  3. Извлечение всех значений из преобразованной таблицы в виде данных CSV.
  4. Удалить временную электронную таблицу.

С помощью вышеуказанного потока можно получить данные CSV со всех листов с определенной ревизией.

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

var file_id = '1JqbuqOQS5NSFqfPlxJG-DY1HIW9xZl_ddjQa_F2pUv4';
var revisions = Drive.Revisions.list(file_id);
var revision = revisions.items[revisions.items.length-1];

// I modified following script.
var revUrl = Drive.Revisions.get(file_id, revision.id).exportLinks["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"]  + "&access_token=" + ScriptApp.getOAuthToken();
var blob = UrlFetchApp.fetch(revUrl).getBlob();
var tempSSId = Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS}, blob).id;
var sheets = SpreadsheetApp.openById(tempSSId).getSheets();
for (var i = 0; i < sheets.length; i++) {
  var csv = sheets[i].getDataRange().getValues().map(function(e) {return e.join(",")}).join("\n");
  Logger.log(csv)
}
Drive.Files.remove(tempSSId);

Обходной путь 2:

Этот обходной путь предполагает условие, что листы в электронной таблице не удаляются и не добавляются.

В этой модификации я использовал следующий поток.

  1. Получить все идентификаторы листа из текущей таблицы.
  2. Создание запросов с использованием полученных идентификаторов листов.
  3. Получение данных CSV с каждого листа.

С помощью вышеуказанного потока можно получить данные CSV со всех листов с определенной ревизией.

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

var file_id = '1JqbuqOQS5NSFqfPlxJG-DY1HIW9xZl_ddjQa_F2pUv4';
var sheetIds = SpreadsheetApp.openById(file_id).getSheets().map(function(e) {return e.getSheetId()});
var token =  ScriptApp.getOAuthToken();
var revisions = Drive.Revisions.list(file_id);
var revision = revisions.items[revisions.items.length-1];
var reqs = sheetIds.map(function(e) {
  var revUrl = Drive.Revisions.get(file_id, revision.id).exportLinks["text/csv"]  + "&access_token=" + token + "&gid=" + e;
  return {url: revUrl, muteHttpExceptions: true};
});
var res = UrlFetchApp.fetchAll(reqs);
for (var i = 0; i < res.length; i++) {
  if (res[i].getResponseCode() == 200 ) {
    Logger.log(res[i].getContentText())
  }
}

Примечание:

  • Этот ответ предполагает, что Drive API включен в Advanced Google Services.

Ссылки

Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.

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