【问题标题】:Retrieve Values for All Sheets in Google Spreadsheet for Particular Revision检索 Google 电子表格中所有表格的值以进行特定修订
【发布时间】:2019-05-20 02:54:36
【问题描述】:

这是一个 sample 电子表格,包含 2 张工作表(Sheet1 和 Sheet2)。单元格值为 1) [["This", "is", "first", "sheet"], ["Added row 2", "", "", ""]] 用于 Sheet1 2) [["This", "is", "second", "sheet"], ["Added row 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 = "This,is,first,sheet\nAdded row 2,,,"

如何获得第二张纸的值?

【问题讨论】:

    标签: google-apps-script


    【解决方案1】:
    • 您要检索最新修订。
      • 这是来自var revision = revisions.items[revisions.items.length-1]
      • 您还想从其他修订中检索 CSV 数据。
    • 您想从所有工作表中检索某个修订的 CSV 数据。
    • 您想使用 Google Apps 脚本。

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

    问题:

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

    并且在当前阶段,无法使用电子表格服务和表格API直接访问ceatain修订的电子表格。因此,当从修订数据中检索 CSV 数据时,如果现有工作表已被删除和/或已添加新工作表,则无法检索所有工作表 ID。

    解决方法 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. 从当前电子表格中检索所有工作表 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。

    参考资料:

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

    【讨论】:

    • 感谢您的详细回答。正是我需要的:)
    • @Michael Lam 很高兴您的问题得到了解决。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    相关资源
    最近更新 更多