如何更改单元格onChange的日期格式?

时间:2014-02-02 10:09:49

标签: javascript google-apps-script

我需要从

更改输入日期/时间的格式
  

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);

     

};

2 个答案:

答案 0 :(得分:1)

我应该首先说我不认为onChange / onEdit解决方案是您正在寻找的,因为我假设您正在动态导入可能不一定触发事件的数据。然而,我会回答你的问题,然后展示另一种方法。

查看Google Apps Script documentation for Events,您会看到编辑事件可以返回4个参数:user(工作表的所有者),source(哪个工作表),range(其中在Sheet)和valuerange特别有用,因为它可以让我们知道编辑的位置(这里是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()方法从一种日期格式更改为另一种日期格式。