【问题标题】:How to move row that is older than this date如何移动早于该日期的行
【发布时间】:2026-01-04 11:30:01
【问题描述】:

我有一个已经有效的脚本,如果它从今天起超过 90 天,它会将行移动到另一个工作表。但如果日期早于每 20 日的上个月,我正在尝试移动该行。

例如如果今天是 3 月 20 日,那么我想移动早于 1 月 20 日的行。

我试着玩弄数字,但它对我不起作用。我可以在这里获得支持吗?

function moveRows90DaysOld() {
  var v=new Date().valueOf()-(1000 * 60 * 60 * 24 * 90);
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('MAIN');
  var tsh=ss.getSheetByName('Archive');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var d=0;
  for(var i=2;i<vA.length;i++) {
    if(new Date(vA[i][0]).valueOf()<v) {
      tsh.appendRow(vA[i]);
      sh.deleteRow(i+1-d++);
    }
  }              
}

【问题讨论】:

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


    【解决方案1】:

    获取 2 个月前日期的最简单方法是使用 setMonthgetMonth 中减去 2。当天也使用setDate

    var v = new Date();
    v.setMonth(v.getMonth()-2); // 2 months earlier
    v.setDate(20);              // 20th day
    

    【讨论】:

    • 当我看到你的答案时,我正在输入我的答案。 :)
    【解决方案2】:

    解释:

    我想提两件事。

    1. 你可以像这样得到previous month20th:

      var v = new Date(); // get today
      v.setDate(20); // set the date to 20th
      v.setMonth(v.getMonth() - 1); // set to the previous month (change to 2 if you want)
      

      如果您想从今天获取上个月的同一天,请删除该行 v.setDate(20) 并仅设置月份。

    2. 请阅读Best Practices 并且不要在for 循环中使用appendRow。将值存储在数组中,然后一次性设置值。

    解决方案:

    function moveRows() {
      // modified code
      var v = new Date(); // get today
      v.setDate(20); // set the date to 20th
      v.setMonth(v.getMonth() - 1); // set to the previous month
      
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getSheetByName('MAIN');
      var tsh=ss.getSheetByName('Archive');
      var rg=sh.getDataRange();
      var vA=rg.getValues();
      var d=0;
      var data = [];
      for(var i=2;i<vA.length;i++) {
        if(new Date(vA[i][0]).valueOf()<v.valueOf()) {
          data.push(vA[i]); // modified code
          sh.deleteRow(i+1-d++);
        }   
      }
      
      // modified code
      if(data.length>0){
      tsh.getRange(tsh.getLastRow()+1,1,data.length,data[0].length).setValues(data);
      }
      
    }
    

    【讨论】: