【问题标题】:How do I auto populate the current time and date when a certain cell is populated using Google Apps Script如何在使用 Google Apps 脚本填充某个单元格时自动填充当前时间和日期
【发布时间】:2019-10-14 08:01:09
【问题描述】:

我希望将日期和时间填充到两个不同的单元格中,当它旁边的列中的单元格填充为“是”时。这个想法是创建一个结帐时间和日期。

脚本的上半部分是签到,下半部分是签出,不过目前只是签出时间,但是签出时间不起作用。有什么建议吗?

function onEdit(event) {
  var timezone = "GMT+1";
  var timestamp_format = "hh:mm:ss"; // Timestamp Format.
  var timestamp_formatT = "dd-MM-yyyy";
  var updateColName = "Student Name";
  var timeStampColName = "Time Out";
  var sheet = event.source.getSheetByName('2019/20'); 
  var actRng = event.source.getActiveRange();
  var editColumn = actRng.getColumn();
  var index = actRng.getRowIndex();
  var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
  var dateCol = headers[0].indexOf(timeStampColName);
  var updateCol = headers[0].indexOf(updateColName); 
  updateCol = updateCol + 1;
  if (dateCol > -1 && index > 1 && editColumn == updateCol) {
    var cell = sheet.getRange(index, dateCol + 1);
    var cellT = sheet.getRange(index, dateCol + 2);
    var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
    var dateT = Utilities.formatDate(new Date(), timezone, timestamp_formatT);
    cell.setValue(date);
    cellT.setValue(dateT);  
  } 
  var updateColName2 = "Check In";
  var timeStampColName2 = "Time In";
  var actRng2 = event.source.getActiveRange();
  var editColumn2 = actRng2.getColumn();
  var index2 = actRng2.getRowIndex();
  var headers2 = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
  var dateCol2 = headers2[0].indexOf(timeStampColName2);
  var updateCol2 = headers2[0].indexOf(updateColName2); 
  updateCol2 = updateCol2 + 1;
  if (dateCol2 > -1 && index2 > 1 && editColumn2 == updateCol2) {
    var cell2 = sheet.getRange(index2, dateCol2 + 1);
    var date2 = Utilities.formatDate(new Date(), timezone, timestamp_format);  
    cell2.setValue(date2);      
  } 
}

如果有帮助,请截图下方表格。

【问题讨论】:

    标签: javascript google-apps-script google-sheets


    【解决方案1】:

    由于一个非常小的细节,它无法正常工作。列标题称为Check IN,在脚本中您正在寻找一个称为Check In 的标题。所以你只需要改变这个:

    var updateColName2 = "Check In";
    

    到这里:

    var updateColName2 = "Check IN";
    

    另外,如果您希望仅当 Check IN 列的值为 Yes 时才填充 Time In 和 Date In 列,您应该添加一个新条件,以便您可以更改此设置:

    if (dateCol2 > -1 && index2 > 1 && editColumn2 == updateCol2) {
    

    收件人:

    if (dateCol2 > -1 && index2 > 1 && editColumn2 == updateCol2 && actRng2.getValue() == "Yes") {
    

    最后,您不需要定义headers2 变量,它与headers 相同。

    编辑

    另外,您应该在最后一个 if 块中添加这一行:

    var date2T = Utilities.formatDate(new Date(), timezone, timestamp_formatT);
    cell2T.setValue(date2T);
    

    所以,完整的代码可能是这样的:

    function onEdit(event) {
      var timezone = "GMT+1";
      var timestamp_format = "hh:mm:ss"; // Timestamp Format.
      var timestamp_formatT = "dd-MM-yyyy";    
      var updateColName = "Student Name";
      var timeStampColName = "Time Out";
      var sheet = event.source.getSheetByName('2019/20'); 
      var actRng = event.source.getActiveRange();
      var editColumn = actRng.getColumn();
      var index = actRng.getRowIndex();
      var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
      var dateCol = headers[0].indexOf(timeStampColName);
      var updateCol = headers[0].indexOf(updateColName); 
      updateCol = updateCol + 1;
      if (dateCol > -1 && index > 1 && editColumn == updateCol) {
        var cell = sheet.getRange(index, dateCol + 1);
        var cellT = sheet.getRange(index, dateCol + 2);
        var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
        var dateT = Utilities.formatDate(new Date(), timezone, timestamp_formatT);
        cell.setValue(date);
        cellT.setValue(dateT);  
      }     
      var updateColName2 = "Check IN";
      var timeStampColName2 = "Time In";
      var actRng2 = event.source.getActiveRange();
      var editColumn2 = actRng2.getColumn();
      var index2 = actRng2.getRowIndex();
      var dateCol2 = headers[0].indexOf(timeStampColName2);
      var updateCol2 = headers[0].indexOf(updateColName2); 
      updateCol2 = updateCol2 + 1;
      var editedValue = actRng2.getValue();
      if (dateCol2 > -1 && index2 > 1 && editColumn2 == updateCol2 && editedValue == "Yes") {
        var cell2 = sheet.getRange(index2, dateCol2 + 1);
        var cell2T = sheet.getRange(index2, dateCol2 + 2);
        var date2 = Utilities.formatDate(new Date(), timezone, timestamp_format); 
        var date2T = Utilities.formatDate(new Date(), timezone, timestamp_formatT);
        cell2.setValue(date2);
        cell2T.setValue(date2T);
      } 
    }
    

    希望对你有帮助。

    【讨论】:

    • 谢谢!时间现在正在工作。真是愚蠢的错误。但是我对日期感到困惑。我是否正在更改 ''' if (dateCol2 > -1 && index2 > 1 && editColumn2 == updateCol2) { ''' to ''' var editValue = actRng2.getValue(); if (dateCol2 > -1 && index2 > 1 && editColumn2 == updateCol2 && editValue == "Yes") { ''' .我的脚本应该是什么样的?
    • 我稍微编辑了我的回复,希望您现在更清楚。基本上,actRng2.getValue() == "Yes" 检查编辑的值是否等于“是”,因此只有在这种情况下才会添加日期和时间。另外,请记住,如果您的问题得到解决,您可以通过接受提供解决方案的答案来标记它;)
    • 不幸的是,这仍然不起作用。时间已满,但日期未满。
    • 对不起,我忘了告诉必须在最后一个 if 块中添加的一行。用这个编辑了我的回复,还添加了完整的代码。希望最终对你有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2021-10-22
    • 2016-12-16
    相关资源
    最近更新 更多