宏:根据工作表名称和特定列将值从一张工作表复制到另一张工作表

时间:2019-10-30 15:46:44

标签: google-apps-script google-sheets

第一次在这里发布,对编写Google脚本非常陌生,因此,我感谢能获得的任何帮助。

我正在尝试设计一个宏,并经历了一些线程,但是没有找到合适的东西。我已经尝试过将程序设计为程序友好的,希望能对您有所帮助。设置如下:

该宏用于从MainSheet的Column1和Column2复制数据,并根据SheetName和Date列上提供的信息,将其粘贴到辅助工作表的相应单元格上。对MainSheet上的每个条目重复此过程。

这里我是该过程的图像示例:Example MainSheet Example SheetA Example SheetB

再次,我将尽我所能提供的帮助。非常感谢你!

编辑:这是示例Google表格电子表格的Link

--- Valraz

4 个答案:

答案 0 :(得分:1)

此功能将在工作表A,B ...中查找与主表中的列匹配的列,并将该数据附加到ColumnA中的工作表名称中。不在乎工作表中的列如何布置。因此,它的运行速度比采用修订版布局要慢一些。但是我一直无聊地以相同的方式做事。

function copyData() {
  var ss=SpreadsheetApp.getActive();
  var msh=ss.getSheetByName('MainSheet');
  var mrg=msh.getRange(1,1,msh.getLastRow(),msh.getLastColumn());
  var vA=mrg.getValues();
  var hA=vA[0];
  var hObj={};
  hA.forEach(function(e,i){if(e){hObj[e]=i;}});
  vA.forEach(function(row,i){
    if(i>0) {
      var pA=[];
      var sh=ss.getSheetByName(row[hObj['SheetName']]);
      var shA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
      var shObj={};
      shA.forEach(function(e,i){if(e){shObj[e]=i;}});
      row.forEach(function(c,j){
        if(shObj.hasOwnProperty(hA[j])) {
          pA.push(c);
        }
      });
      sh.appendRow(pA);
    }
  });
}

这是直接的方法。

function copyData1() {
  var ss=SpreadsheetApp.getActive();
  var msh=ss.getSheetByName('MainSheet');
  var mrg=msh.getDataRange();
  var vA=mrg.getValues();
  vA.forEach(function(r,i){
    if(i>0) {
      var sh=ss.getSheetByName(r[0]);
      sh.appendRow([r[1],r[2],r[3]],r[4]);//Modified for more columns
    }
  });
}

答案 1 :(得分:0)

关键问题我想,您的工作表A和工作表B如何接收数据?是插入数据的人还是正在执行数据的脚本?

答案 2 :(得分:0)

在工作表A中输入以下公式:

=QUERY(MainSheet!A:D,"select * where A='Sheet A'",-1)

在工作表B中输入以下公式:

=QUERY(MainSheet!A:D,"select * where A='Sheet B'",-1)

您也可以在宏或Google应用程序脚本中执行此操作

答案 3 :(得分:0)

正如我之前所说的使用Query,这会自动创建您的工作表并获取下一个日期:

function CopyDataFromMainSheet() {
  var spreadsheet = SpreadsheetApp.getActive();
  var mysheet;
  mysheet=spreadsheet.getSheetByName('MainSheet');
  //8 is spare columns that may be can used
  var myrange=mysheet.getRange('A1').offset(0, mysheet.getLastColumn()+8);
  myrange.setFormula('=Query(MainSheet!A2:A' + mysheet.getLastRow() + ',"Select A ,count(A) Group By A",0)'); 
  var jojo=mysheet.getRange(1,myrange.getColumn(),mysheet.getLastRow(),1).getValues();
  //Clear Query
  myrange.clear();
  for  (a=1 ;a<jojo.length;a++){
    //Create New Sheet That Not found included with header
    if(spreadsheet.getSheetByName(jojo[a][0])==null) if (jojo[a][0]!='') {
      spreadsheet.insertSheet(jojo[a][0]);
      spreadsheet.getRange('MainSheet!1:1').copyTo(spreadsheet.getSheetByName(jojo[a][0]).getRange("A1"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    }

    if(spreadsheet.getSheetByName(jojo[a][0])!=null) if (jojo[a][0]!='') {
      var myDate=new Date('1 jan 1900');

      var DestLastRow = spreadsheet.getSheetByName(jojo[a][0]).getLastRow();
      if (DestLastRow>1) myDate=new Date(spreadsheet.getSheetByName(jojo[a][0]).getRange('B' + DestLastRow).getValue());
      var dateStr = [
                  myDate.getFullYear(),
                  ('0' + (myDate.getMonth() + 1)).slice(-2),
                  ('0' + myDate.getDate()).slice(-2)
               ].join('-');
      myrange.setFormula('=Query(MainSheet!A:E,"Select * where A=\'' + jojo[a][0] + '\' and B>date \'' + dateStr + '\'",0)'); 

      var RsltRange=myrange.getA1Notation() + ":" + 
          mysheet.getRange("A1").offset(mysheet.getLastRow()-1,
          mysheet.getLastColumn()-1).getA1Notation();
      //Copy Value
      spreadsheet.getRange('MainSheet!' + RsltRange).copyTo(spreadsheet.getSheetByName(jojo[a][0]).getRange("A"+DestLastRow), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
      //copy format
      spreadsheet.getRange('MainSheet!' + RsltRange).copyTo(spreadsheet.getSheetByName(jojo[a][0]).getRange("A"+DestLastRow), SpreadsheetApp.CopyPasteType.PASTE_FORMAT, false);

      myrange.clear();
    }
  }
};