【问题标题】:Last modified date in Google App Script GAS sheetsGoogle App Script GAS 表中的最后修改日期
【发布时间】:2019-07-25 22:11:27
【问题描述】:

我正在尝试从我正在开发的 GAS 插件中获取工作表的最后修改日期。

我目前的想法是获取驱动器修订列表,然后取最后一个值。这对于刚刚获得最后一次修改来说似乎有点矫枉过正,我也担心如果根据此链接建议的修订数量超过 1000,这会破坏。

https://developers.google.com/drive/api/v3/reference/revisions/list

理想情况下,我也想知道变化的范围,但我认为这是不可能的。

我无法使用onEdit 事件,因为我想跟踪未安装插件的用户所做的编辑。

  var fileId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var revisions = Drive.Revisions.list(fileId);
  var revisionLength = revisions.items.length;

  if(revisionLength > 0){
    var revision = revisions.items[revisionLength-1];
    var date = new Date(revision.modifiedDate);
    Logger.log(date.toString());
  }

【问题讨论】:

  • 您使用的是什么插件?您是否将 Apps 脚本称为附加组件?
  • 没错
  • 编辑是否只能由人进行?我正在尝试找出为什么 onEdit 不适合您。
  • onEdit 确实有效,但前提是用户安装了插件,如果未安装插件,则 onEdit 不会触发。我需要一个适用于已安装和未安装用户的解决方案。我还需要一个让所有用户保持同步的解决方案,而 onEdit 只会触发进行更改的用户。
  • 您是在开发插件,还是在编写属于特定表格文档的脚本?需要明确的是,Apps 脚本内置于表格中,所有与您的表格交互的用户都会触发 onEdit 简单触发器 (developers.google.com/apps-script/guides/triggers/#Simple)。

标签: google-apps-script google-sheets-api


【解决方案1】:

鉴于您需要您的插件用户访问非插件用户的修订信息,云端硬盘修订列表正是您所需要的。令人高兴的是,您可以获得修订的内容,因此如果您希望可以计算差异。我不知道您的数据是什么样的,所以这可能很容易或几乎不可能。

除此之外:就您的观点而言,大约有 1000 多个修订,如果有超过 1000 个(或任何您的页面大小)修订,您将得到一个 nextPageToken,如下所示:

{
 "kind": "drive#revisionList",
 "nextPageToken": "BHNMJKHJKHKVJHyugaiohasdzT1JyUmlQWG10RUJ1emx1S2xNDg4EgQzMzY1GAI=",
 "revisions": [
    ...
 ]
}

如果您发现需要再次列出修订,请提供该令牌。

无论如何,当您列出修订时,每个修订将如下所示:

{
 "kind": "drive#revision",
 "etag": "\"som3-e-tAg\"",
 "id": "3365",
 "selfLink": "https://www.googleapis.com/drive/v2/files/dummydummydummy/revisions/3365",
 "mimeType": "application/vnd.google-apps.spreadsheet",
 "modifiedDate": "2018-10-19T19:05:41.762Z",
 "published": false,
 "exportLinks": {
  "application/x-vnd.oasis.opendocument.spreadsheet": "https://docs.google.com/spreadsheets/export?id=dummydummydummy&revision=3365&exportFormat=ods",
  "text/tab-separated-values": "https://docs.google.com/spreadsheets/export?id=dummydummydummy&revision=3365&exportFormat=tsv",
  "application/pdf": "https://docs.google.com/spreadsheets/export?id=dummydummydummy&revision=3365&exportFormat=pdf",
  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "https://docs.google.com/spreadsheets/export?id=dummydummydummy&revision=3365&exportFormat=xlsx",
  "text/csv": "https://docs.google.com/spreadsheets/export?id=dummydummydummy&revision=3365&exportFormat=csv",
  "application/zip": "https://docs.google.com/spreadsheets/export?id=dummydummydummy&revision=3365&exportFormat=zip",
  "application/vnd.oasis.opendocument.spreadsheet": "https://docs.google.com/spreadsheets/export?id=dummydummydummy&revision=3365&exportFormat=ods"
 },
 "lastModifyingUserName": "Joe User",
 "lastModifyingUser": {
  "kind": "drive#user",
  "displayName": "Joe User",
  "picture": {
   "url": "https://lh3.googleusercontent.com/-asdfsadf/AAAAAAAAAAI/AAAAAAAAFOk/OIPUYOIUGO/s64/photo.jpg"
  },
  "isAuthenticatedUser": true,
  "permissionId": "123456789",
  "emailAddress": "user@gmail.com"
 }
}

如果您的数据不是非常复杂或庞大,您可以通过 text/csv 导出链接获取您希望比较的修订版的目标,然后在 Apps 脚本中进行比较。

这可能看起来像:

var fileId = SpreadsheetApp.getActiveSpreadsheet().getId();
var revisions = Drive.Revisions.list(fileId);
var revisionLength = revisions.items.length;

if(revisionLength > 1) {  // something to compare!
  var revision = revisions.items[revisionLength-1];
  var newContent = UrlFetchApp.fetch(revision.exportLinks["text/csv"]).getContent();
  newContent = Utilities.parseCsv(newContent);

  var oldRevision = revisions.items[revisionLength-2];
  var oldContent = UrlFetchApp.fetch(oldRevision.exportLinks["text/csv"]).getContent();
  oldContent = Utilities.parseCsv(oldContent);

  # TODO check they're the same size!

  # where do they differ?
  for (var row = 0; row < newContent.length; row++) {
    for (var col = 0; col < newContent[0].length; col++) {
      if (newContent[row][col] != oldContent[row][col]) {
        Logger.log('Change on row ' + (row + 1) + ' column ' + (col + 1));
      }
  }

  # when did it change?
  var date = new Date(revision.modifiedDate);
  Logger.log(date.toString());
}

【讨论】:

  • 一些免责声明:我没有尝试在插件中使用 UrlFetch,这可能会被禁止。 CSV 导出 URL 只为您提供一个工作表,因此如果您的工作表文档有多个工作表,这会变得更加复杂。
  • 非常感谢您的回复。我会在明天测试并回复您!
  • 不幸的是,这不起作用,导出中给出的 url docs.google.com/spreadsheets/… 实际上并不是一个文件,它只是一个指向然后下载文件的页面的链接。因此我得到的数据实际上是那个页面而不是实际文件,你知道有什么方法可以解决这个问题吗?
  • 尝试像docs.google.com/spreadsheet/… 这样的URL(gid=... 部分是选项卡ID,对于单选项卡文档可能是多余的)-如果可行,我将简化我的答案,因为我们不'不必对修订对象做这么多
  • 抱歉,我有点不确定你的网址中的 ccc 是什么意思?我已经尝试过了,它会向 Google 抛出一个错误页面。你从哪里得到这个网址的?我们确实需要支持多张工作表,所以我们可能是标签 ID
【解决方案2】:

我相信你可以这样做

var lastUpdated = DriveApp.getFileById(fileId).getLastUpdated();

查看函数reference

【讨论】:

  • 这对我来说似乎并没有随着每个值的变化而更新。它似乎只是每分钟左右更新一次?
  • 如果这还不够,您可能需要检查修订响应的时间频率/准确性我刚刚尝试了带有 pageSize=1 选项的 Drive.Revisions.list,但它没有返回最后一个修订
  • 是的,令人讨厌的是,修订响应在最后显示了最后一个修订,因此您需要翻页到最后一个。这适用于进行修改的时间,但是在某些情况下,当您有两个用户编辑文档时,似乎返回了错误的用户名,非常烦人!
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多