检索Google电子表格中所有表格的值以进行特殊修订

时间:2019-05-20 02:54:37

标签: google-apps-script

这是一个sample电子表格,具有2张纸(Sheet1和Sheet2)。单元格值是 1)Sheet1的[[“ This”,“ is”,“ first”,“ sheet”],[“ Added row 2”,“”,“”,“”]] 2)Sheet2的[[“ This”,“ is”,“ second”,“ sheet”],[“ Added row 2”,“”,“”,“”]]

当我运行以下代码时,

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 =“ This,is,first,sheet \ n已添加第2行,”

如何获取第二个图纸值?

1 个答案:

答案 0 :(得分:0)

  • 您要检索最新版本。
    • 这来自var revision = revisions.items[revisions.items.length-1]
    • 您还希望从其他版本中检索CSV数据。
  • 您要从某个修订版本的所有工作表中检索CSV数据。
  • 您要使用Google Apps脚本。

如果我的理解正确,那么这个答案如何?

问题:

很遗憾,无法从脚本的revUrl中检索所有工作表的CSV数据。 exportLinks["text/csv"]的默认端点指示电子表格的第一个标签。如果要检索其他工作表,则需要为每个工作表添加gid={sheetId}的查询参数。

在当前阶段,无法使用Spreadsheet Service和Sheets API直接访问ceatain版本的Spreadsheet。因此,从修订数据中检索CSV数据时,如果已经删除了现有工作表和/或已经添加了新工作表,则无法检索所有工作表ID。

解决方法1:

  

此变通办法假设条件是必须删除并添加电子表格中的工作表。

在此修改中,我使用了以下流程。

  1. 从特定版本的电子表格中检索XLSX数据。
  2. 将XLSX数据转换为临时电子表格到Google Spreadsheet。
  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. 从当前电子表格中检索所有工作表ID。
  2. 使用检索到的工作表ID创建请求。
  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())
  }
}

注意:

  • 此答案假定高级Google服务已启用Drive API。

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。