谷歌工作表中的自定义日期验证与弹出警报

时间:2017-12-12 10:02:18

标签: validation google-apps-script google-sheets formatting format

我有一张谷歌表,每天由超过20人编辑。有时会发生某人在"日期栏"中粘贴日期之外的东西。或者只是简单的格式写日期。所以我希望制作一个脚本,将日期格式设置为" yyy-mm-dd",然后设置数据验证以检查日期是否正确(以避免出现类似&#34的日期; 2017- 22 -17"),如果您粘贴或写错了日期,最后会弹出消息框。 我写了下面的代码并触发了它" onEdit"但我无法处理这个弹出消息的事情; /

  function SetDateFormat() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheetByName("Sheet1")
  var cell = sheet.getRange(4, 3, sheet.getMaxRows())
  cell.setNumberFormat('yyyy-mm-dd')
}


function setAndCheckDate() {
  var ss = SpreadsheetApp.getActive()
  var sheet =ss.getSheetByName("Sheet1")
  var cell = sheet.getRange(4, 3, sheet.getMaxRows())
  var rule1 = cell.getDataValidation()
      var rule2 =SpreadsheetApp.newDataValidation().requireDate().build()
      cell.setDataValidation(rule2)

      if(rule1 !== rule2) {
        Browser.msgBox("Date is incorrect!")
      }
}

另一件事是,当我将包含不正确数据的单元格粘贴到我的日期列时,验证脚本不起作用。

https://docs.google.com/spreadsheets/d/1ZPbfX60E46W95XhMTXpBSLTUAT71QCe-MFnYhYy2PPw/edit?usp=sharing

你可以建议吗?

2 个答案:

答案 0 :(得分:0)

您正在寻找Apps脚本中的formatDate(日期,时区,格式),它根据您描述的规范格式化日期。

 // This formats the date as Greenwich Mean Time in the format
 // year-month-dateThour-minute-second.
 var formattedDate = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd'T'HH:mm:ss'Z'");
 Logger.log(formattedDate);

答案 1 :(得分:0)

最简单的答案是使用数据验证而不是脚本来控制人们可以在日期列中输入什么。

  1. 选择列。
  2. 选择“格式”>“数字”>“更多格式”>“更多日期和时间格式”。
  3. 选择所需的列格式。
  4. 点击“应用”。
  5. 在标题上按住Shift键并单击以将其从所选区域中删除。
  6. 选择数据>数据验证。
  7. 选择条件:日期为有效日期。
  8. 选择拒绝输入。
  9. 点击外观复选框。
  10. 输入帮助文本,例如“以YYYY-mm-dd格式输入有效日期。”
  11. 点击保存。

如果您担心有人故意删除数据验证或将值粘贴到单元格中,则可以使用以下脚本对从onEdit捕获的值进行检查,以检查该值是否为日期。

const cols = {
  "date": 2 // column number that contains date
}

function onEdit(e) {
  let range = e.range;
  let col = range.getColumn();
  if (col == cols.date) {
    let value = range.getValue();
    let newDate = new Date(value);
    let timeCheck = newDate.getTime();
    let isTime = (timeCheck === timeCheck);
    if (!isTime) {
      let message = "'" + value + "' is not a date. Please enter a valid date.";
      let ui = SpreadsheetApp.getUi();
      ui.alert(message);
      range.setValue(""); // or however you want to handle a date error
    }
  }
}

如果该值不是有效日期,则返回的时间为NaN,并且NaN永远不等于自身。