在某些条件下如何更改日期范围?

时间:2019-09-07 12:33:54

标签: google-apps-script google-sheets

在某些情况下是否可以使用按钮将一个或多个日期更改为当前日期?

在我的示例表中,“主页”选项卡包含用户列表和要执行的检查数量(“检查”列O)。

在选项卡“ Ticker Check”中,还有列A“用户ID”,列I“上次检查”和列L“下一次检查”。下一步检查是基于目前不重要的各种因素计算的。

现在,我想为每个用户添加一个按钮到“主页”选项卡,以将“行情检查”选项卡中的列I“最后检查”的所有日期设置为当前日期,其中“列L”的日期为“相应行中的“下一个检查”是今天还是过去(在示例表中,由于条件格式,相关单元格显示为红色)。这意味着仍在将来的日期不受影响。

注意:在J列中,时间戳是由脚本生成的,我在下面附加了该脚本。除其他事项外,此时间戳由列I“最后检查”中“选项卡检查”选项卡中的条目触发。因此,对我来说重要的是,请勿干扰此功能。

不幸的是,我没有足够的编程知识。因此,我将非常感谢我可以学习的解决方案。

这是我的工作表的链接。 https://docs.google.com/spreadsheets/d/1z8Yom8oyfK8YVljndw1mSicdzkokbfCxm_U1vKSJk9k/edit?usp=sharing

function onEdit(e)
{ 
  var timezone = "GMT+2";
  var timestamp_format = "HH:mm:ss"; // Timestamp Format. 
  var updateColName = "date";
  var updateColName1 = "Monat"; // define your 2nd column
  var timeStampColName = "timestamp";
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet();

  //var sheet = e.source.getActiveSheet() 
  //var sheet = e.source.getSheetByName('Geprüfte Ticker'); //Name of the sheet where you want to run this script.


  var actRng = SpreadsheetApp.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) { // only timestamp if 'Last Updated' header exists, but not in the header row itself!
    var cell = sheet.getRange(index, dateCol + 1);
    var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
    cell.setValue(date);
  }

  //add code to update time/date stamp if the additionally defined columns have changes
  var dateCol = headers[0].indexOf(timeStampColName);
  var updateCol = headers[0].indexOf(updateColName1); updateCol = updateCol+1;

  if (dateCol > -1 && index > 1 && editColumn == updateCol) { // only timestamp if ‘Last Updated’ header exists, but not in the header row itself!
  var cell = sheet.getRange(index, dateCol + 1);
  var date = Utilities.formatDate(new Date(), timezone, timestamp_format);
  cell.setValue(date);
  }

}

1 个答案:

答案 0 :(得分:0)

工作流程如下:

  1. 通过var today=new Date()检索今天的日期
  2. 通过将毫秒值与getTime()进行比较,将L列中的日期与今天进行比较
  3. 在第I列中为满足条件“将来的日期”并且A列中的值对应于for loop中的所需用户ID的行设置今天的日期。
  4. 创建一个按钮,例如使用Insert Drawing,右键单击按钮,选择Assign script...,然后插入要在按钮单击时运行的函数的名称,如图here所示。

这是实现它的方法:

function myButton1(){
  var userId=1;
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var tickerCheck = ss.getSheetByName('Ticker Check');
  var startRow=12;
  var lastRow=tickerCheck.getLastRow()-startRow+1;
  var range=tickerCheck.getRange(startRow,12,lastRow,1)// getRange(row, column, numRows, numColumns)
  var valuesNextCheck=range.getValues();
  var userIds=tickerCheck.getRange(startRow,1,lastRow,1).getValues();
  var rangeLastCheck=tickerCheck.getRange(startRow,9,lastRow,1);
  var today=new Date();
  var dateInMs=new Date(today.getFullYear(), today.getMonth(), today.getDate()).getTime();
  for(var i=0;i<valuesNextCheck.length;i++){
   var nextDate=valuesNextCheck[i][0]
   if((nextDate instanceof Date)&&(userIds[i][0]==userId)){
     if(dateInMs>=nextDate.getTime()){
         rangeLastCheck.getCell(i+1, 1).setValue(today);
      }
    }
  } 
}

对于其他用户,创建功能myButton2()myButton3(),相应地调整userId,然后将功能绑定到相应的按钮。

  

参考:Date objects