无法使用应用程序脚本格式化日期如何将字符串更改为日期
Posted
技术标签:
【中文标题】无法使用应用程序脚本格式化日期如何将字符串更改为日期【英文标题】:Cant format date using apps script how to change a string to a date 【发布时间】:2021-04-17 23:12:20 【问题描述】:我有一张顶部有日期的表格。日期的格式并不完全相同。我在欧洲,所以它们通常是 dd/mm/yy 或 dd/mm/yyyy。我把这个函数放到apps脚本区
function dateChange()
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var column = sheet.getRange("D1:Y1");
column.setNumberFormat("dd/mm/yy");
为了使所有内容都保持相同的格式但没有更改任何值,仍然有很多内容显示为 dd/mm/yyyy。我还尝试仅突出显示该行并选择格式 - 然后将其设为 dd/mm/yy - 仍然不行。
下面的评论者建议它们可能是字符串,而不是日期。如何测试单元格内容是字符串还是日期?如果它是像 31/03/21 或 31/03/2021 这样的字符串,我该如何将其更改为日期?
这里是一个精简版工作表的链接,您可以在其中看到单元格中混合的“日期”格式:https://docs.google.com/spreadsheets/d/1N0DwwON-7u7Rsqu8tSLYCPfogKCmZBaQHise-vthHII/edit?usp=sharing
我也试过这个函数,结果显示在 cmets 中:
function datestuff()
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var lastColumn = sheet.getLastColumn()
for(i = 1; i < lastColumn; i++)
var range = sheet.getRange(1, i);
var data = range.getValue();
Logger.log(data) // results are 20/3/2021, 19/3/21 etc. a mixture of dd/mm/yyyy and dd/mm/yy
dateValue = new Date(data)
Logger.log(dateValue) // results are all Wed Dec 31 19:00:00 GMT-05:00 1969, Wed Dec 31 19:00:00 GMT-05:00 1969
【问题讨论】:
可能不是约会对象。它们可能是字符串 我敢打赌就是这样。 【参考方案1】:要检查单元格是否包含数字日期或看起来像日期的文本字符串,请使用=isnumber()
公式。
如果您从文本文件或类似电子表格的文件中导入数据,请设置电子表格的区域设置,使其通过文件>电子表格设置与数据匹配,然后重新导入所有数据。这应该可以正确转换日期。
如果电子表格是您唯一的数据副本,您可以使用公式将文本字符串日期转换为数字日期。为了获得最好的帮助,请分享一个可公开编辑的sample spreadsheet,并提供逼真的数据。
【讨论】:
请问那会是什么样子?我很难理解人们经常在这里写什么。还没习惯。 var data = sheet.getRange(x,y).getValue(); if(data = isNumber()( Logger.log("its a number") 或其他什么?我才刚刚开始我的旅程,所以一个例子说明你所说的“使用 isNumber() 公式”这将是一个很大的帮助,也可能会帮助我理解其他人对其他问题的回答! “使用=isnumber()
公式”表示“转到电子表格,单击一个单元格并输入=isnumber(A1)
,其中A1
是您要检查的单元格。然后按Enter 键查看单元格A1
是否包含数值或是否包含文本。【参考方案2】:
似乎没有一种简单的方法来做我需要做的事情,所以我选择了行,格式化为数字>纯文本,找到 /21 替换为 /2021 然后我运行了以下函数:
function datestuff()
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var lastColumn = sheet.getLastColumn()
for(i = 1; i = lastColumn; i++)
var range = sheet.getRange(1, i);
var data = range.getValue();
if(data != "")
Logger.log("Cell contents are: " + data)
var dataArray = data.split("/")
Logger.log(dataArray)
var dataDay = dataArray[0]
Logger.log("Day part is " + dataDay)
dataDay = parseInt(dataDay)
var dataMonth = dataArray[1]
Logger.log("month part is " + dataMonth)
dataMonth = parseInt(dataMonth) - 1
var dataYear = dataArray[2]
Logger.log("year part is " + dataYear)
dataYear = parseInt(dataYear)
if(dataYear < 2000) dataYear = dataYear + 2000
Logger.log("Day is: " + dataDay + " Month is: " + dataMonth + " Year is: " + dataYear)
dateValue = new Date(dataYear, dataMonth, dataDay)
Logger.log(dateValue)
range.setValue(dateValue)
我仍然感到震惊,没有一种非常简单的方式可以说“这是格式化为日期吗?如果不是,就这样做!”
【讨论】:
注意:您正在使用parseInt(string)
之类的代码。当您使用 Rhino 运行时时,这不会提供您想要的值,例如 08
或 09
。它应该适用于 V8 运行时,但最佳实践是始终明确指定基数,如 parseInt(string, 10)
。见MDN。以上是关于无法使用应用程序脚本格式化日期如何将字符串更改为日期的主要内容,如果未能解决你的问题,请参考以下文章