我们可以在不使用Google脚本中的onEdit()触发器的情况下获取单元格的旧值吗?

时间:2019-10-18 23:56:09

标签: google-apps-script

function onEdit(evt) 
{
var sheet = evt.source.getActiveSheet();
var range =  evt.range;
var column = evt.range.getColumn();
var row =    evt.range.getRow();
var sheetName = sheet.getName();

if(range.getRow() >= 3 && range.getColumn() >= 2  && range.getRow() <= 15 &&  range.getColumn() <= 2 )
 {
  if(sheetName == "Emails")
  {
   Logger.log(evt.value);//current value
   //Logger.log(evt.oldValue);//old value            
  }
 }
}

我不想将上述代码用于旧值,还有其他方法可以实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

根据您评论中的解释

  

您好ziganotschka,我只是想为电子邮件创建逻辑   通过比较旧值和新值来进行通知。我正在尝试创建一个   功能,如果在2天内未在一定范围内进行修改,请发送   通知电子邮件。你能帮我解释一下逻辑吗?

  • 您要监视值并在两天内没有更改的情况下发送电子邮件
  • 为此,您需要存储上次更改后的值(和时间戳记),您可以使用Script properties
  • 您需要一个可以为onEdit或time-driven的触发器,该触发器将定期检查当前值,将其与存储的值进行比较,并估计自上次编辑以来已经过了2天。
  • 由于您不想使用onEdit触发器,因此请在下面找到与时间驱动触发器一起使用的代码的补充
  • 您可以通过以下方法将触发器绑定到您的函数:转到“编辑”->“当前项目”的触发器->“创建新触发器”
  • 根据需要将Select event source设置为Time-driventypeinterval,例如Hour timerEvery hour

示例:

function checkUpdateStatus()
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Emails");
  //Selects a range of 13 rows and one column starting with the third row, second column - adapt to your needs if necessary
  var range =  sheet.getRange(3,2,13,1);
  var values=range.getValues();
  var now=new Date().getTime();
  for(var i=0;i<values.length;i++){
    for(var j=0;j<values[0].length;j++){
      //the following lines will set-up script properties the first time you use them:
      if(PropertiesService.getScriptProperties().getKeys().length==0){ 
        PropertiesService.getScriptProperties().setProperty('values '+i+"-"+j,values[i][j]);
        PropertiesService.getScriptProperties().setProperty('timestamp '+i+"-"+j,now);
        //if script properties have been set-up already:
      }else{
        //use parseInt() if your values are integers, otherwise ommit it 
        var currentValue=parseInt(PropertiesService.getScriptProperties().getProperty('values '+i+"-"+j));
        //if the value is still the same - check how long it has been the same
        if(currentValue==values[i][j]){
          var timeDifference=now-(PropertiesService.getScriptProperties().getProperty('timestamp '+i+"-"+j));
          var days=timeDifference/1000/3600/24;
          if(days>2){
            //send email
          }
          //if the value has been changed, update the script properties with the new value and timestamp
        }else{
          PropertiesService.getScriptProperties().setProperty('values '+i+"-"+j,values[i][j]);
          PropertiesService.getScriptProperties().setProperty('timestamp '+i+"-"+j,now);
        }
      }
    }
  }
}