- Вы хотите получить последнюю версию.
- Это от
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:
Этот обходной путь предполагает условие удаления и добавления листов в электронную таблицу.
В этой модификации я использовал следующий поток.
- Извлечение данных XLSX из электронной таблицы определенной ревизии.
- Преобразование данных XLSX в электронную таблицу Google в виде временной таблицы.
- Извлечение всех значений из преобразованной таблицы в виде данных CSV.
- Удалить временную электронную таблицу.
С помощью вышеуказанного потока можно получить данные 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:
Этот обходной путь предполагает условие, что листы в электронной таблице не удаляются и не добавляются.
В этой модификации я использовал следующий поток.
- Получить все идентификаторы листа из текущей таблицы.
- Создание запросов с использованием полученных идентификаторов листов.
- Получение данных 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.
Ссылки
Если я неправильно понял ваш вопрос, и это был не тот результат, которого вы хотите, я прошу прощения.