首页 > 解决方案 > 当在同一行、不同单元格中选择特定值时,Google 脚本仅在单元格中插入当前日期一次

问题描述

我正在编写一个给我带来麻烦的脚本。G 列具有选项列表值 M1、M2、M3、S1、S2、S3、S4、S5、C1、C2、C3。当从选择列表中选择任何 S 值(S1、S2、S3、S4、S5)时,我希望在 t 列中插入一个时间戳。我希望仅在第一次出现时完成此操作,而不是在 g 列中的选项列表值随后更新或更改时完成。

我很接近,但当前脚本会更新整个 t 列中的日期。

如果可能的话,我还想清理第 9 行。

到目前为止我有这个:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('ClientList');
  var stageValues = s.getRange('g3:g').getValues();
  var dateValues = s.getRange('t3:t').getValues();

  for (var row in stageValues) 
    for (var col in stageValues[row])
      if (stageValues[row][col] == 'S1' || stageValues[row][col] == 'S2' || stageValues[row][col] == 'S3' || stageValues[row][col] == 'S4' || stageValues[row][col] == 'S5' && dateValues[row][col] == '') {
        num = parseInt(row) + 3;
        s.getRange('t' + num).setValue(new Date());
        }
  };

标签: google-apps-script

解决方案


你说选择列表值,我假设你的意思是一个下拉列表。但无论如何这都会奏效。每当在 G 列中手动编辑单元格时,onEdit 触发器将检查“S”值和 T 列中的时间戳。如果没有找到时间戳,它将放置一个新的时间戳。“e”是包含有关已编辑单元格信息的触发器对象。

function onEdit(e) {
  try {
    if( e.range.getSheet().getName() === "ClientList" ) {
      if( e.range.getColumn() === 7 ) {  // edit in column G
        if( e.value.charAt(0) === "S" ) {
          if( e.range.offset(0,13,1,1).getValue() === "" ) {  // no value in T
            e.range.offset(0,13,1,1).setValue(new Date());
          }
        }
      }
    }
  }
  catch(err) {
    Logger.log(err);
  }
}

推荐阅读