Google apps script 在一定条件下,如何在一定范围内更改日期?

Google apps script 在一定条件下,如何在一定范围内更改日期?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,在某些情况下,是否有办法使用按钮将一个或多个日期更改为当前日期 在我的示例表中,选项卡“主页”包含用户列表和要执行的检查数(列O“要检查”) 在“股票行情检查”选项卡中,还有A列“用户ID”、I列“最后一次检查”和L列“下一次检查”。下一次检查是根据此时不重要的各种因素进行计算的 现在,我想为每个用户在选项卡“主页”上添加一个按钮,以将选项卡“股票代码检查”中第I列“上次检查”的所有日期设置为当前日期,其中各行中第L列“下次检查”的日期为今天或过去(在示例表中,由于条件格式的原因,相关单元格被涂

在某些情况下,是否有办法使用按钮将一个或多个日期更改为当前日期

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

在“股票行情检查”选项卡中,还有A列“用户ID”、I列“最后一次检查”和L列“下一次检查”。下一次检查是根据此时不重要的各种因素进行计算的

现在,我想为每个用户在选项卡“主页”上添加一个按钮,以将选项卡“股票代码检查”中第I列“上次检查”的所有日期设置为当前日期,其中各行中第L列“下次检查”的日期为今天或过去(在示例表中,由于条件格式的原因,相关单元格被涂成红色)。这意味着仍然在未来的日期应该不受影响

注意:在J列中,时间戳是由脚本生成的,我在下面附加了一个脚本。除其他事项外,此时间戳由第I列“最后一次检查”中“股票代码检查”选项卡中的条目触发。因此,对我来说,这一功能不受干扰是很重要的

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

这是我的工作表的链接。

}

工作流程如下所示:
  • 使用
    var today=new date()检索今天的日期
  • 通过将以毫秒为单位的值与
    getTime()
  • 为满足“日期不在未来”条件且A列中的值对应于
    for循环中所需的用户ID的行,在I列中设置今天的日期
  • 创建一个按钮,例如,使用
    插入图形
    ,右键单击该按钮,选择
    分配脚本…
    ,并在按钮单击时插入要运行的功能的名称,如图所示 以下是您可以如何实现它:

    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);
          }
        }
      } 
    }
    
    函数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(行,列,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=新日期();
    var dateInMs=新日期(today.getFullYear()、today.getMonth()、today.getDate()).getTime();
    for(var i=0;i=nextDate.getTime()){
    rangeLastCheck.getCell(i+1,1).setValue(今天);
    }
    }
    } 
    }
    
    对于其他用户,创建函数
    myButton2()
    myButton3()
    ,相应地调整
    userId
    ,并将函数绑定到相应的按钮

    参考:


    哇!这是伟大的,几乎正是我所需要的。是否可以只更改单个用户的日期(参见A12列)?问题是,用户应该只能为自己的行更改日期。因此,我想为每个用户在选项卡“主页”列Q中放置一个按钮。在我的最后一页中,最多有40个用户。如果您想为每个用户创建一个单独的按钮,您需要为每个用户创建一个稍微修改的功能,请参阅我的更新答案。但是,如果您有许多用户,您可能会考虑其他解决方案,例如实现一个动态对话框/侧栏,提示用户输入将传递给函数的Id。当我启动脚本时,会出现一个引用错误:“userID”未定义。但是,这是一个实现动态提示的好建议。我该怎么做?对不起,我拼错了变量名,在两种情况下都应该是userID,或者在两种userID中都应该是。我只是在代码中修改了它。没问题。我非常感谢你的帮助。不幸的是,我的时间戳脚本无法识别列I中myButton1脚本所做的更改。原因是什么?我的时间戳脚本在H或I列中注册更改,然后在J列中创建一个时间戳,这是计算L列中我的公式所需的。如何解决这个问题?
    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);
          }
        }
      } 
    }