我需要从
更改输入日期/时间的格式2014年2月3日星期一12:00:00 GMT + 0000(UTC)
到
2013年6月14日星期五14:38:13 GMT
我一直试图通过我有限的JavaScript技能弄明白,但无法弄清楚如何选择新行。
我希望这可以在更改到细胞范围D:D& F:˚F
这是我到目前为止所拥有的;
函数onChange(){
var sheet = SpreadsheetApp.getActive();
ScriptApp.newTrigger( “fixDate”)
.forSpreadsheet(片材)
.onChange()
.create();
};
和
function fixDate(oldDate){
var oldDate ='Mon Feb 03 2014 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(分裂[1]);
Logger.log(分裂[2]);
Logger.log(分裂[3]);
Logger.log(分裂[4]);
Logger.log(分裂[5]);
Logger.log(分裂[6]);
Logger.log(newDate);
};
答案 0 :(得分:1)
我应该首先说我不认为onChange / onEdit解决方案是您正在寻找的,因为我假设您正在动态导入可能不一定触发事件的数据。然而,我会回答你的问题,然后展示另一种方法。
查看Google Apps Script documentation for Events,您会看到编辑事件可以返回4个参数:user
(工作表的所有者),source
(哪个工作表),range
(其中在Sheet)和value
。 range
特别有用,因为它可以让我们知道编辑的位置(这里是more on Range Class)。值得注意的是,此更改信息不会在更广泛的范围内返回。
同样值得指出的是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}) (\d{2}) (\d{2,4}) (\d{2}:\d{2}:\d{2}\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()以所需格式返回。这比在空间上分割更可靠,因为它寻找模式。这意味着一旦编辑了日期,它将不会再次重新格式化,因为模式将不匹配。
在上面的例子中,我们使用正则表达式返回一个字符串。 Google表格有existing functions/formula called REGEXREPLACE。使用formatDate中使用的相同模式,我们可以使用公式:
=REGEXREPLACE(D1,"([a-zA-Z]{3,4}) ([a-zA-Z]{3}) (\d{2}) (\d{2,4}) (\d{2}:\d{2}:\d{2}\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}) (\d{2}) (\d{2,4}) (\d{2}:\d{2}:\d{2}\s[A-Z]{3}).*$", "$1, $3 $2 $4 $5"))
这将输出整个D:D列的格式化日期。
此答案中使用的所有代码(包括工作表公式)均为found here(文件>制作副本以查看代码/公式)
答案 1 :(得分:0)
给定任何Date对象,您可以使用toUTCString()
方法从一种日期格式更改为另一种日期格式。