【问题标题】:Get last updated date of a Google Spreadsheets as JSON endpoint获取 Google 电子表格的最后更新日期作为 JSON 端点
【发布时间】:2020-03-18 09:33:57
【问题描述】:

我有一个公共的 Google 电子表格,我想使用 Javascript 中的 JSON 端点获取它的更新日期。

这里是 JSON 端点:https://spreadsheets.google.com/feeds/list/1hrae_CqzDZjXR8CUs8d7_sqpit5WUk7sPv94nyHY1A4/1/public/basic?alt=json

您可能会在feed.updated.$t 中看到一个日期(目前是 2020-03-17T13:59:25.968Z : 3 月 17 日 13:59)。

但是当我想用 Javascript 获取它时,我总是得到当前的日期和时间,我不明白为什么。

const elDate = document.getElementById('date');
const elFormattedDate = document.getElementById('formatted-date');

$.getJSON('https://spreadsheets.google.com/feeds/list/1hrae_CqzDZjXR8CUs8d7_sqpit5WUk7sPv94nyHY1A4/1/public/basic?alt=json', function(data) {
    var date = data.feed.updated.$t;
    var formattedDate = new Date(date);
    elDate.innerHTML = date;
    elFormattedDate.innerHTML = formattedDate;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="banner-message">
  <ul>
    <li><b>Date</b> : <span id="date"></span></li>
    <li><b>Formatted date</b> : <span id="formatted-date"></span></li>
  </ul>
</div>

【问题讨论】:

    标签: javascript jquery json google-sheets


    【解决方案1】:

    每次调用端点时,feed.updated.$t 字段都会更新(尝试刷新几次以亲自查看)。这就是为什么你得到当前日期。您没有做错任何事,这正是 Google Sheets API 的工作方式。

    【讨论】:

    • 我刚刚用 Postman 试了一下,我得到了当前日期。我不明白的是,当我用浏览器读取 JSON 端点时,我得到了“真实”日期。
    • @crtlf 你的意思是当你使用 Postman 时你得到了正确的日期?
    • 不,我得到当前日期,与 Javascript 相同。使用浏览器查看 JSON 时,我只能得到正确的日期。
    • @crtlf 嗯,这是预期的行为。每当您调用此 API 时,日期都会更新为当前日期。您对此无能为力。
    • @crtlf 在这种情况下,我认为您可以尝试使用触发器:developers.google.com/apps-script/guides/triggers
    【解决方案2】:

    正如@huytc 所说,每次您向此端点发出请求时,updated 时间都会更新,因此您将始终获得当前日期,而不是上次更新电子表格的日期。

    解决方法:使用 Drive API:

    要获取此电子表格的最后更新日期,您可以使用 Drive API 中的 RevisionsChanges 集合(请参阅两者之间的区别 here)。

    例如,您可以通过Revisions.list 列出与此文件关联的所有修订。您只需在 API 请求中提供文件的 id。作为响应,您将得到以下内容:

    {
      "revisions": [
        {
          "modifiedTime": datetime,
          // ... rest of revision 1 properties
        },
        {
          "modifiedTime": datetime,
          // ... rest of revision 2 properties
        },
        // ... rest of revisions
        {
          "modifiedTime": datetime,
          // ... rest of last revision properties
        }    
      ],
      // ... rest of properties
    }
    

    回复中最后修订的modifiedTime 是您要查找的日期。

    参考:

    【讨论】:

      【解决方案3】:

      我回答我自己的问题是为了说明清楚。

      说明

      感谢@huytc's answer,很明显,从浏览器调用 JSON 端点与从 Javascript 脚本调用 JSON 端点没有区别。日期的差异仅仅是由于浏览器缓存。

      需要明确的是,此 JSON 端点将始终为您提供当前日期,而不是上次更新电子表格的日期。

      使用应用脚本的解决方法

      尽管使用 Google Drive API 的@Iamblichus's 变通方法看起来更简洁,但我发现只是为了获取最后更新日期有点“矫枉过正”,尤其是因为它不仅需要 API 密钥,还需要所有 oAuth过程。

      正如@huytc 建议的那样,我在应用脚本中使用了一个触发器来使其工作。我创建了一个名为“信息”的新工作表,并使用了以下脚本:

      function onEdit(e) {
        var s = SpreadsheetApp.getActiveSpreadsheet();
        var sheet = s.getSheetByName('Informations');
        var date = new Date();
        var range = sheet.getRange(2, 1);
        range.setValue(date);
      }
      

      This gist帮了我很多。

      参考文献

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-27
        相关资源
        最近更新 更多