【问题标题】:Copy rows that meet a date in Google Sheets在 Google 表格中复制符合日期的行
【发布时间】:2020-01-02 05:12:28
【问题描述】:

我希望能够将行从源工作表复制到目标工作表,该范围内的日期等于目标日期。

我正在使用以下脚本,并且当目标是“文本”时可以正常工作,但是一旦我尝试使用“日期”,我就会收到以下错误:TypeError:无法从未定义中读取属性“长度”。

function copyrange() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Source'); //source sheet
   var testrange = sheet.getRange('F:F');
  var testvalue = (testrange.getValues());
  var csh = ss.getSheetByName('Destination'); //destination sheet
  var data = [];
  var j =[];

  //Condition check in L:L; If true copy the same row to data array
for (i=0; i<testvalue.length;i++) {
  if ( testvalue[i] == 'target') {
  data.push.apply(data,sheet.getRange(i+1,1,1,45).getValues());
  //Copy matched ROW numbers to j
  j.push(i);
 }
 }
//Copy data array to destination sheet

 csh.getRange(csh.getLastRow()+1,1,data.length,data[0].length).setValues(data);

}

谢谢 西蒙

【问题讨论】:

  • 你如何选择你的目标日期?

标签: google-apps-script google-sheets


【解决方案1】:

我不确定您的目标是什么,所以我假设当前日期并继续进行。如果有错请告诉我。

function copyrange() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Source');
  var vA=sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
  var csh=ss.getSheetByName('Destination');
  var found=false;
  var dt=new Date();
  var today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();//midnight
  var output=[];
  for (var i=0;i<vA.length;i++) {
    var date=new Date(vA[i][4]);//can be a string the constructor recognizes or a date
    var dv=new Date(date.getFullYear(),date.getMonth(),date.getDate()).valueOf();//midnight
    if (dv==today) {
      output.push(vA[i]);
      var found=true;
    }
  }
  if(found) {
    csh.getRange(csh.getLastRow()+1,1,output.length,output[0].length).setValues(output);
  }else{
    SpreadsheetApp.getUi().alert('No matches');
  }
}

以下函数将获取具有今天日期和此电子邮件 email1@test.com 的那些行。

function copyrange(target) {
  var target=target||'email1@test.com';
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Source');
  var vA=sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
  var csh=ss.getSheetByName('Destination');
  var found=false;
  var dt=new Date();
  var today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();//midnight
  var output=[];
  for (var i=0;i<vA.length;i++) {
    var date=new Date(vA[i][4]);//can be a string the constructor recognizes or a date
    var dv=new Date(date.getFullYear(),date.getMonth(),date.getDate()).valueOf();//midnight
    if (dv==today && vA[i][6]==target) {
      output.push(vA[i]);
      var found=true;
    }
  }
  if(found) {
    csh.getRange(csh.getLastRow()+1,1,output.length,output[0].length).setValues(output);
  }else{
    SpreadsheetApp.getUi().alert('No matches');
  }
}

您可以通过将电子邮件传递给函数来更改目标电子邮件。

此函数涵盖上周发生的日期:

function copyrange(target) {
  var target=target||'email1@test.com';
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Source');
  var vA=sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
  var csh=ss.getSheetByName('Destination');
  var found=false;
  var dt=new Date();
  var today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();//midnight
  var sevendaysago=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()-7).valueOf();//midnight
  var output=[];
  for (var i=0;i<vA.length;i++) {
    var date=new Date(vA[i][4]);//can be a string the constructor recognizes or a date
    var dv=new Date(date.getFullYear(),date.getMonth(),date.getDate()).valueOf();//midnight
    if (dv>=sevendaysago && dv<=today && vA[i][6]==target) {
      output.push(vA[i]);
      var found=true;
    }
  }
  if(found) {
    csh.getRange(csh.getLastRow()+1,1,output.length,output[0].length).setValues(output);
  }else{
    SpreadsheetApp.getUi().alert('No matches');
  }
}

此函数只复制匹配行的 B 和 G。

function copyrange(target) {
  var target=target||'email1@test.com';
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Source');
  var vA=sh.getRange(1,1,sh.getLastRow(),sh.getLastColumn()).getValues();
  var csh=ss.getSheetByName('Destination');
  var found=false;
  var dt=new Date();
  var today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();//midnight
  var sevendaysago=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()-7).valueOf();//midnight
  var output=[];
  for (var i=0;i<vA.length;i++) {
    var date=new Date(vA[i][4]);//can be a string the constructor recognizes or a date
    var dv=new Date(date.getFullYear(),date.getMonth(),date.getDate()).valueOf();//midnight
    if (dv>=sevendaysago && dv<=today && vA[i][6]==target) {
      output.push([vA[i][1],vA[6]]);
      var found=true;
    }
  }
  if(found) {
    csh.getRange(csh.getLastRow()+1,1,output.length,output[0].length).setValues(output);
  }else{
    SpreadsheetApp.getUi().alert('No matches');
  }
}

【讨论】:

  • 感谢您的及时回复,我试图复制您的代码,但得到了同样的错误。我添加了示例表的屏幕截图,也许我没有正确使用您的代码?。
  • 另外,不必是今天的日期,它可以是目标工作表中特定单元格的日期,或者更好,如果我可以使用 2 个单元格构建开始和结束日期的范围。
  • 那么明显的问题是第 6 列或 F 列不是日期。
  • 立即尝试。我刚刚在我的数据上进行了测试,它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多