【问题标题】:append row with date in Google Sheet using Google Apps Scripts and retain date formatting specified in sheets使用 Google Apps 脚本在 Google 表格中附加日期行并保留表格中指定的日期格式
【发布时间】:2019-06-07 18:59:28
【问题描述】:

我的工作表中有一个具有自定义日期格式的列。格式设置在整个列上。如果从工作表中将日期值放在列中,它会按照我指定的方式显示格式。但是,如果我使用 Google Apps 脚本追加一个新行,它将不遵守格式。

在通过 Google Apps 脚本添加行之前:

| Timestamp                 | Message |
|---------------------------|---------|
| 2019-01-01 @ 13:12:32.013 | test    |

添加一行后:

| Timestamp                 | Message |
|---------------------------|---------|
| 2019-01-01 @ 13:12:32.013 | test    |
|         1/2/2019 14:51:31 | test2   |

用于添加行的 Google Apps 脚本代码:

SpreadsheetApp.getActiveSheet().appendRow([new Date(), "test2"])

有没有办法以表格按照格式规则对其进行格式化的方式获取要添加的日期?

我发现的唯一方法是将数据转换为表示自 1899 年 12 月 30 日以来的天数的整数,但这似乎很 hacky。

var dateSerial = ((new Date()) - (new Date(1899, 11, 30))) / 1000 / 60 / 60 / 24;

【问题讨论】:

  • 你试过 setNumberFormat() 吗?或者可能是 Utilities.formatDate()?
  • 这两个都需要从 JavaScript 设置格式。如果工作表中的格式发生更改,那么我将不得不更新代码。我希望能够在需要时/如果需要更改工作表中的格式,而无需更新代码。
  • 我猜只是不一样。我更喜欢在代码中这样做。
  • @Cooper 我正在编写代码,其他人将使用该表。我不希望代码在/如果他们更改日期格式时中断。

标签: javascript date google-apps-script format


【解决方案1】:

正如@Cooper 在他的评论中提到的,您可以通过Utilities.formatDate() 实现这一点。

我使用以下脚本进行了测试,日期格式完全符合您的要求。

function addDate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var tz = ss.getSpreadsheetTimeZone();
  var d = Utilities.formatDate(new Date(), tz, 'yyyy-MM-dd @ hh:mm:ss.SSS');
  sh.appendRow([d,'test']);
}

您真正需要感兴趣的是var d,其中定义了日期。我为此使用了电子表格时区,但您可以使用任何您喜欢的时区。

var d = Utilities.formatDate(new Date(), tz, 'yyyy-MM-dd @ hh:mm:ss.SSS');

编辑:

用户不想在脚本本身中设置日期格式,而是我们可以使用getNumberFormat() 从上面的列中获取数字格式,然后使用setNumberFormat() 格式化新条目。

详情请参阅下面的脚本。

function setDate() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var lr = sh.getLastRow();

  //get format for last row in column A
  var format = sh.getRange(lr, 1).getNumberFormat();

  //add new data to sheet
  sh.appendRow([new Date(), 'test']);

  //format new data
  sh.getRange(lr+1, 1).setNumberFormat(format);
}

【讨论】:

  • 这需要我在 Javascript 中设置格式。请参阅上面我对 Cooper 的回复。
  • @IMTheNachoMan 我刚刚用一个应该满足您要求的解决方案编辑了答案。
  • 谢谢。我会看看这是如何工作的。我想看看什么会更有效,拉取数据格式然后重新设置或只是将值添加为dateserial。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多