如何将信息从一张纸复制到另一张纸?

时间:2019-04-12 15:46:40

标签: google-apps-script google-sheets

我正在尝试编写一个脚本,以将信息从Google表格中的一个工作表复制到另一个工作表,作为每日更新。该信息按行显示(例如第5行包含我要复制的所有信息,其中A列为输入的日期) 如果条目(列A)上的日期与今天的日期不匹配,则需要将整行转移到另一张纸上。

我无法将包含输入信息的日期的单元格与今天的日期进行比较,然后捕获该单元格的行号,然后设置要复制的变量。

在新工作表上,它需要扫描下一个空白行的范围,然后将信息粘贴到下一个空白行。

目前,我为一个单元格设置了要复制/粘贴的位置,但是我将为整个单元格设置它。

更新:我已经弄清楚了如何复制信息。我要搜索的行从第5行的“复制自”选项卡开始,我的代码可以搜索并比较信息在B列中输入的日期和今天的日期。然后,带有的代码会将该行中的信息复制到新的“复制到”选项卡上。

我现在想弄清楚如何从“复制自”选项卡中删除信息,以便该信息仅在我的电子表格中存在一次,无论是在“复制自”选项卡上(如果输入的信息是今天的日期还是将来的日期) )或“复制到”标签上(如果输入的信息来自今天的日期之前)。我在底部添加了一行代码来执行此操作,但是在运行代码时,它会复制一些信息,同时删除其他部分,并复制今天的信息。有什么帮助吗?

function funcname() {
  var Sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy From");
  var Sheet2 =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy To");        
  var ColumntoSearch = 2;
  var LastRow = Sheet.getLastRow();

  //Gets column to search for dates to compare to Today
  var Range = Sheet.getRange(5, ColumntoSearch, LastRow, 1);
  var Values = Range.getValues();

  //Sets the amount of data to copy over
  var NumberofColumns = 27;
  var NumberofRows = 1;

  var DestRow = Sheet2.getLastRow()+1; 

  //Compares all the Dates in the Copy From tab to Today
  var dt=new Date();
  var dt1=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate());
  var dv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
  var d=0;
  for (var i=0;i+d<Values.length;i++){

    //If dates are less than today, they will be copied over to the Copy To tab
    if(new Date(Values[i+d][0]).valueOf()<dv){
      var RangetoCopy = Sheet.getRange((i+5), 1, NumberofRows, NumberofColumns);
      var DestRange = Sheet2.getRange(DestRow, 1, NumberofRows, NumberofColumns);
      DestRow++;
      RangetoCopy.copyTo(DestRange);


      Sheet.deleteRows(i+7);
     }
   }
 }

1 个答案:

答案 0 :(得分:0)

尝试一下:

此函数一次读取所有日期,并循环运行,比较午夜12:00到今天的所有日期。 >或=今天的日期将从输出中删除。

function copyDateNotEqualToToday() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName("Copy From");
  var sh2=ss.getSheetByName("New Sheet");
  var rg=sh.getRange(5,1,sh.getLastRow()-4,1);
  var vA=rg.getValues();
  var dt=new Date();
  var dt1=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate());
  var dv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
  var d=0;
  for (var i=0;i+d<vA.length;i++){
    if(new Date(vA[i+d][0]).valueOf()>=dv){
      vA.splice(i+d,1);
      d++;
    }
  }
  sh2.getRange(1,1,vA.length,1).setValues(vA);
}

我的输入表:

enter image description here

我的输出表:

enter image description here

我在做什么与您在做什么有些不同。我正在使用您所谓的“值”数组中所有当日>或=的元素,并将其从数组中删除。遍历所有行之后,我然后使用...将所有值复制到目标表中以使用您的条款setValues(Values),而我并没有从源表中删除任何内容。

但是,您正在做的是将数据从源移动到目标,因此您希望能够在循环时删除当前行。这就是该功能。

function copyIfLessThan() {
  var Sheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy From");
  var Sheet2=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Copy To");        
  var Range=Sheet.getRange(5,2,Sheet.getLastRow(),1);
  var Values=Range.getValues();
  var dt=new Date();
  var dv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
  var d=0;
  for(var i=0;i<Values.length;i++) {
    if(new Date(Values[i][0]).valueOf()<dv){
      var RangetoCopy=Sheet.getRange(i-d+6,1,1,27); 
      var DestRange=Sheet2.getRange(Sheet2.getLastRow()+1,1,1,27);
      RangetoCopy.copyTo(DestRange);
      Sheet.deleteRows(i-d+6);//removing rows not elements of Values Array
      d++;
    }
  }
}