首页 文章

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

提问于
浏览
0

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

Mon Feb 03 2014 12:00:00 GMT 0000(UTC)

格林威治标准时间2013年6月14日星期五14:38:13

我一直试图通过我有限的JavaScript技能弄明白,但无法弄清楚如何选择新行 .

我希望这可以改变到单元格范围D:D&F:F

这是我到目前为止所拥有的;

function onChange(){var sheet = SpreadsheetApp.getActive(); ScriptApp.newTrigger(“fixDate”) . forSpreadsheet(sheet).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(分裂[0]);
Logger.log(分裂[1]); Logger.log(分裂[2]); Logger.log(分裂[3]); Logger.log(分裂[4]); Logger.log(分裂[5]); Logger.log(分裂[6]); Logger.log(newDate); };

2 回答

  • 1

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

    查看Google Apps Script documentation for Events,您将看到编辑事件可以返回4个参数: user (工作表的所有者), source (工作表), range (工作表中的位置)和 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()以所需格式返回 . 这比在空间上分割更可靠,因为它寻找模式 . 这意味着一旦编辑了一个日期,它就赢了't be reformatted again because the pattern won't匹配 .

    使用内置公式代替

    在上面的示例中,我们使用正则表达式返回一个字符串 . 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(文件>制作副本以查看代码/公式)

  • 0

    给定任何Date对象,您可以使用 toUTCString() 方法从一种日期格式更改为另一种日期格式 .

相关问题