如何使用 Google Apps 脚本在 Google Sheet 中仅设置一段时间的格式?

How can I set formatting for just a time duration in a Google Sheet using Google Apps Script?

在另一个程序中,我计算了一个事件的持续时间。结果以秒为单位。在外部程序(使用 LuaScript)中,我将此秒结果转换为字符串,格式为“hh:mm:ss.SSS”。然后,我通过 Google Apps Script POST 将其 Google Sheets,我想将其写入下一个可用行 (ss.appendRow)。它大部分显示正确,除了四舍五入到最接近的整数秒,而不是保持毫秒。

Google Sheets 正确地将此字符串识别为 date/time,但认为它是实际时间而不是持续时间。例如,如果事件耗时 5.75 秒,则单元格中的输出显示“00:00:05”,而当我 select 单元格时,它实际上显示“12:00:05 AM”。

按照我在这个网站上找到的建议,我尝试了这个代码:

function doPost(e) {
  var s = SpreadsheetApp.openById(myID);
  var ss = s.getSheetByName("TimeResults");
  var params = JSON.parse(e.postData.contents);

  ss.appendRow([Utilities.formatDate(new Date(params.draftDuration), s.getSpreadsheetTimeZone(), 'hh:mm:ss.SSS'));

  return ContentService.createTextOutput('{"status":"ok"}').setMimeType(ContentService.MimeType.JSON);
}

但这导致了意外的输出,显示“5:00:00 AM”。显然,我错误地使用了 Date 对象。我应该怎么做才能使这项工作按预期进行,以显示持续时间,例如“00:00:05.75”?

这是 e.postData.contents 中包含的 JSON 的片段:

  "gameDate": 05/07/2022
  "draftDuration": 0:0:3.75
  "gameDuration": 0:0:5.323

如果原始值以秒为单位,如 5.323 中的五秒和 323 毫秒,您可以将它转换为 dateserial 值,如下所示:

dataserial = seconds / 24 / 60 / 60

将结果值附加到电子表格并将单元格或整列的格式设置为持续时间,例如 [h]:mm:ss.SSS,其中 [h] 表示经过的小时数。

小时字段需要表示为经过的小时数才能正确处理超过 24 小时的持续时间。分秒不超过60,无论表示日历时间还是经过时间,都可以同样处理。

有关日期和时间值在电子表格中的工作原理的说明,请参阅 this answer