【问题标题】:Insert timestamp based on specific criteria根据特定条件插入时间戳
【发布时间】:2019-03-15 21:05:19
【问题描述】:

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

我已经有一个可以这样做的代码,但只有当我在第一列中手动输入状态时(时间戳已正确添加到它们各自的状态列中),但我不能一次更新多个.

如果我粘贴多个“状态”,脚本只会根据第一行运行时间戳,而不考虑其他状态。这是一个非常简短的video,它演示了它在做什么。

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

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”中插入时间戳,依此类推。

Here 是我正在工作的工作表。

【问题讨论】:

  • 这没有意义if(sheet.getRange(row, 1,rows).getValue()==1) 如果rows >1 你只会得到左上角的单元格值。
  • 我相信这是列,如果第 1 列中的行 = 1,则在第 2 列中插入时间戳。依此类推。随意尝试一下:docs.google.com/spreadsheets/d/… 然而,对我来说,问题是一次做多个(粘贴多个状态时)。

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


【解决方案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);
    }
  }
}

这是我的工作表的样子:

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

具有附加要求的替代解决方案:

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);
      }
    }
  }
}

【讨论】:

  • 确保您获得的是最新版本,因为我已经编辑了几次。
  • 这真是太棒了,库珀!如果不是太麻烦,有没有办法检查时间戳列,如果它是空白的,只插入一个时间戳? (为了避免覆盖现有的时间戳?)另外,我注意到如果“状态选择”单元格被删除(0 或 null),它会插入时间戳而不是状态(第一列)。有没有办法将时间戳限制为仅插入特定的时间戳范围(例如,B:G)。感谢您的帮助。
  • 感谢库珀的更新,我永远无法想出这个。最后一个问题,我试图将公式留在状态选择列中,例如 A 列第 2 行(第一个状态):if(Z2="Status1",1,if(Z2="Status2",2,"")但时间戳不会随公式结果触发。你会碰巧知道为什么,或者我怎样才能让它与公式一起工作? (以便我用公式填充所有第 1 列以读取实际行文本状态,并返回一个数字 (1-10) 以添加相应的时间戳。(我有另一个脚本不断插入实际文本状态)再次,谢谢。
  • 简单触发器设计为仅在用户进行更改时运行。有一些可安装的触发器可以检测到一些变化。您可以阅读他们的相关信息here
  • 我会说您最好的选择是在该列中使用数据验证
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2015-02-26
  • 2023-03-27
  • 2019-06-10
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多