如何更改单元格onChange的更改日期格式?
Posted
技术标签:
【中文标题】如何更改单元格onChange的更改日期格式?【英文标题】:How to change the change the date format of a cell onChange? 【发布时间】:2014-02-02 10:09:49 【问题描述】:我需要更改输入日期/时间的格式
2014 年 2 月 3 日星期一 12:00:00 GMT+0000 (UTC)
到
格林威治标准时间 2013 年 6 月 14 日星期五 14:38:13
我一直试图用我有限的 javascript 技能来解决这个问题,但不知道如何选择新行。
我希望对单元格范围 D:D 和 F:F 进行更改
这是我目前所拥有的;
函数 onChange()
var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("fixDate")
.forSpreadsheet(工作表)
.onChange()
.create();
;
和
函数 fixDate(oldDate)
var oldDate = '2014 年 2 月 3 日星期一 12:00:00 GMT+0000 (UTC)'
var split = oldDate.split(/ /); var newDate = split[0] + ", " + split[2] + " " + split[1] + " " + split[3] + " " + split[4] + " GMT"; Logger.log(split[0]);
Logger.log(split[1]);
Logger.log(split[2]);
Logger.log(split[3]);
Logger.log(split[4]);
Logger.log(split[5]);
Logger.log(split[6]);
Logger.log(newDate);
;
【问题讨论】:
熟悉documentation of Date 会有所帮助吗? Google Apps 脚本有一种方法可以按照您想要的方式将日期格式转换为字符串:developers.google.com/apps-script/reference/utilities/… 请注意,如果您将单元格内容更改为字符串,它当然不再是日期对象...您确定要这样做吗? 感谢你们的 cmets。 @Sergeinsas,我不在乎它是否是字符串。更重要的是如何在添加新行后在特定列范围内执行此操作,然后将其写回同一单元格。 使用新的电子表格推出,您实际上无法做到这一点。这是一个已知的缺陷,需要修复。您可以查看问题跟踪器(并加注星标):code.google.com/p/google-apps-script-issues/issues/… 【参考方案1】:我首先应该说我不认为您正在寻找 onChange/onEdit 解决方案,因为我假设您正在动态导入可能不一定会触发事件的数据。不过,我会回答你的问题,然后展示另一种方法。
查看Google Apps Script documentation for Events,您会看到编辑事件可以返回 4 个参数:user
(Sheet 的所有者)、source
(哪个 Sheet)、range
(在Sheet 中的位置)和value
。 range
特别有用,因为它让我们知道编辑发生在哪里(这里是more on Range Class)。还值得注意的是,范围更广的 Change Event 中不返回此信息。
还值得指出triggers can be set from the Script editor Resources menu or programmatically(请参阅使用容器特定的可安装触发器),正如您在问题中所做的那样。通常我从资源菜单设置触发事件,因为我通常是唯一的用户。坚持使用程序化路线,您的脚本可以表示为(注意在 onEdit 事件之后有 2-3 秒的延迟更新):
function onChange()
var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger("fixDate")
.forSpreadsheet(sheet)
.onChange()
.create();
function fixDate(e)
e.range.setValue(formatDate(e.value)); // set value based on formating existing value
function formatDate(aDate)
var regexp = /([a-zA-Z]3,4) ([a-zA-Z]3) (\d2) (\d2,4) (\d2:\d2:\d2\s[A-Z]3).*$/; // RegEx to match date format
return aDate.replace(regexp, "$1, $3 $2 $4 $5"); // return modified date as string
要使用它,您需要运行一次onChange
函数来添加触发器。在此之后,每次在电子表格中编辑 e
参数,其中包含范围,值信息用于获取和设置编辑值。无论正在编辑的列如何,此脚本都将运行。您可以扩展它以检查正在编辑的列,并且通过将 fixDate 替换为仅影响 D 列和 F 列:
function fixDate(e)
var col = e.range.getColumn(); // returns int https://developers.google.com/apps-script/reference/spreadsheet/range#getColumn()
if (col === 4 || col === 6) // 4 = D, = F
e.range.setValue(formatDate(e.value)); // set value based on formating existing value
对于formatDate
函数,我使用正则表达式来匹配字符串的某些部分,例如dayofweek、month、day 等。使用String.replace() 以您想要的格式返回。这比在寻找模式时分割空间更可靠。这意味着一旦编辑了日期,它将不会再次重新格式化,因为模式不匹配。
改用内置公式
在上面的例子中,我们使用了一个正则表达式来返回一个字符串。谷歌表格有一个existing functions/formula called REGEXREPLACE。使用 formatDate 中使用的相同模式,我们可以使用公式:
=REGEXREPLACE(D1,"([a-zA-Z]3,4) ([a-zA-Z]3) (\d2) (\d2,4) (\d2:\d2:\d2\s[A-Z]3).*$", "$1, $3 $2 $4 $5")
这将在单元格 D1 中以所需格式返回一个值。请注意,这必须在单独的列中,因为您不能有循环引用。问题可能是您不想手动将此公式复制到整个列中,但 Google 表格有另一个公式,它基本上允许使用 ARRAYFORUMLA 将其应用于公式范围。例如,要使用它,您可以在单元格 G1 中输入:
=ARRAYFORMULA(REGEXREPLACE(D:D,"([a-zA-Z]3,4) ([a-zA-Z]3) (\d2) (\d2,4) (\d2:\d2:\d2\s[A-Z]3).*$", "$1, $3 $2 $4 $5"))
这将输出整个 D:D 列的格式化日期。
此答案中使用的所有代码(包括工作表公式)都可以是 found here(文件 > 复制以查看代码/公式)
【讨论】:
+1,谢谢!我会尝试将此应用到我的工作表上。您更正了使用 Zapier 将其从 Streak 自动导入到 Google 工作表上的新行。 Arrayformula 运行良好。现在唯一的问题是有一个标题行。 :( @kkampen 您可以使用 A1 表示法在ARRAYFORMULA
中指定范围。要跳过标题,您可以使用=ARRAYFORMULA(REGEXREPLACE(D2:D ...
之类的内容。如果您知道将获得多少行数据,则可以准确定义范围,例如对于 2-20 行 =ARRAYFORMULA(REGEXREPLACE(D2:D20 ...
mhawksey 几乎明白了。但看起来辅助应用程序仍然没有正确格式化它。我怎样才能让它变得更容易。像这样 2008 年 8 月 25 日
Jusr 玩弄输出模式,所以不是"$1, $3 $2 $4 $5"
,它可能类似于"$3 $2 $4"
【参考方案2】:
给定任何 Date 对象,您可以使用 toUTCString()
方法从一种日期格式更改为另一种日期格式。
【讨论】:
以上是关于如何更改单元格onChange的更改日期格式?的主要内容,如果未能解决你的问题,请参考以下文章