根据特定条件插入时间戳(Google表格/脚本)

时间:2019-03-15 21:05:20

标签: google-apps-script google-sheets timestamp spreadsheet

我正在尝试创建一个基本的时间戳脚本。简而言之,我运行的某些任务会经历不同的状态(状态1、2、3等)。我想跟踪每个任务(行)每个状态的时间戳。

我已经有一个代码可以执行此操作,但是仅当我在第一列中手动输入一个状态(时间戳已正确添加到其各自的状态列中)时,但我一次不能更新多个状态。

如果我粘贴多个“状态”,则脚本仅基于第一行运行时间戳,而不考虑其他状态。这是一段很短的视频,展示了它的功能:https://drive.google.com/file/d/1IkbtP9u0PJOpi8UAV80rXK9wnI0m4jo5/view?usp=sharing

我将在一个大文件中使用该脚本,该文件会自动更新,但无法正常工作。这是我当前正在使用的代码(如果很简单,请道歉,我充其量是业余爱好者)。

function OnEdit(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var row = range.getRow();
  var rows = range.getNumRows();
  var date = new Date();
  var dates = sheet

      .getRange(row, 3, rows)
      .getValues()
      .map(function(row) {return [row[0] || date];});
if(sheet.getRange(row, 1,rows).getValue()==1) {   sheet
   .getRange(row, 2, rows)
   .setValues(dates);
  }
  else
  {if(sheet.getRange(row, 1,rows).getValue()==2) {   sheet
   .getRange(row, 3, rows)
   .setValues(dates);
  }
    else
  {if(sheet.getRange(row, 1,rows).getValue()==3) {   sheet
   .getRange(row, 4, rows)
   .setValues(dates);
                                                 }
  }
  }
}

如果status = 1,则在“ Col B”中插入时间戳,如果status = 2,则在“ Col C”中插入时间戳,依此类推。

任何帮助将不胜感激(经过几天的搜索并且找不到类似的情况),这是我正在工作的工作表:https://docs.google.com/spreadsheets/d/14xujKhSgnlBnA0o84UkArRfBP1GVwYOTDQQynaWQm34/edit#gid=0

1 个答案:

答案 0 :(得分:1)

尝试一下:

因此,现在您可以编辑一个单元格或复制多个单元格,然后将其粘贴到column1中,时间戳将出现在e.range.columnStart + whatever the selection in column one was列中。我在第一列上使用了数据验证,但是您可以做任何您想做的事情。您可能需要添加类似if(e.range.getSheet().getName()!='Sheet1'){return;}

的条件
function onEdit(e) {
  var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM/dd/yyyy HH:mm:ss");
  if(e.range.columnStart==1 && e.range.rowStart>1) {//if you are editing column1
    var sA=e.range.getValues();//get all values in range
    for(var i=0;i<sA.length;i++) {
      e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).setValue(timeStamp);
    }
  }
}

这是我的工作表的样子:

enter image description here

我为更多时间戳列添加了一些选择

具有其他要求的替代解决方案:

function onEdit(e) {
  var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM/dd/yyyy HH:mm:ss");
  if(e.range.columnStart==1 && e.range.rowStart>1) {//if you are editing column1
    var sA=e.range.getValues();//get all values in range
    for(var i=0;i<sA.length;i++) {
      var ts=e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).getValue();
      if(sA[i][0]>0 && !ts) {
        e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).setValue(timeStamp);
      }
    }
  }
}

此列按列标题名称进行选择,以便您可以将列添加到column1的左侧。在这种情况下,它也将动作限制为特定的工作表Sheet92。

function onEdit(e) {
  if(e.range.getSheet().getName()!='Sheet92'){return;}
  var colName=e.range.getSheet().getRange(1,e.range.columnStart).getValue();
  var timeStamp=Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM/dd/yyyy HH:mm:ss");
  if(colName=='Status Choice' && e.range.rowStart>1) {
    var sA=e.range.getValues();
    for(var i=0;i<sA.length;i++) {
      var ts=e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).getValue();
      if(sA[i][0]>0 && !ts) {
        e.range.getSheet().getRange(e.range.rowStart+i,Number(sA[i][0]) + e.range.columnStart).setValue(timeStamp);
      }
    }
  }
}