Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 宏:根据图纸名称和特定列,将值从一张图纸复制到另一张图纸_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 宏:根据图纸名称和特定列,将值从一张图纸复制到另一张图纸

Google apps script 宏:根据图纸名称和特定列,将值从一张图纸复制到另一张图纸,google-apps-script,google-sheets,Google Apps Script,Google Sheets,第一次在这里发帖,对编写谷歌脚本还很陌生,所以我非常感谢能得到的任何帮助 我正试图设计一个宏,并通过一些线程,但没有找到适合的东西。我已经试着将这个过程设计成我所能想象的程序友好型,希望它能有所帮助。设置如下所示: 单个电子表格,多张表格。主图纸和不断增加的辅助图纸数量(示例中有SheetA和SheetB) 主工作表的列结构为:SheetName、Date、Column1、Column2。辅助图纸的列结构始终相同:日期、第1列和第2列 该宏用于从主工作表上的Column1和Column2复制

第一次在这里发帖,对编写谷歌脚本还很陌生,所以我非常感谢能得到的任何帮助

我正试图设计一个宏,并通过一些线程,但没有找到适合的东西。我已经试着将这个过程设计成我所能想象的程序友好型,希望它能有所帮助。设置如下所示:

  • 单个电子表格,多张表格。主图纸和不断增加的辅助图纸数量(示例中有SheetA和SheetB)

  • 主工作表的列结构为:SheetName、Date、Column1、Column2。辅助图纸的列结构始终相同:日期、第1列和第2列

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

我在此举一个过程的图像示例:

再一次,我会感谢任何我能得到的帮助。多谢各位

编辑:下面是谷歌电子表格的一个示例


---Valraz

我想这是一个至关重要的问题,您的工作表A和工作表B是如何接收数据的?是插入数据的人还是执行此操作的脚本?

此函数将查找工作表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
    }
  });
}

在活页A中输入以下公式:

=QUERY(MainSheet!A:D,"select * where A='Sheet A'",-1)
=QUERY(MainSheet!A:D,"select * where A='Sheet B'",-1)
在表B中输入以下公式:

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

您也可以在宏或谷歌应用程序脚本中执行此操作,正如我之前所说,在这里使用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();
    }
  }
};
函数CopyDataFromMainSheet(){
var电子表格=SpreadsheetApp.getActive();
var-mysheet;
mysheet=spreadsheet.getSheetByName('MainSheet');
//8是可以使用的备用列
var myrange=mysheet.getRange('A1').offset(0,mysheet.getLastColumn()+8);
myrange.setFormula('=Query(MainSheet!A2:A'+mysheet.getLastRow()+',“选择A,按A计数(A)组”,0)”;
var jojo=mysheet.getRange(1,myrange.getColumn(),mysheet.getLastRow(),1).getValues();
//明确询问
myrange.clear();
对于(a=1;a1)myDate=新日期(电子表格.getSheetByName(jojo[a][0]).getRange('B'+DestLastRow.getValue());
var dateStr=[
myDate.getFullYear(),
('0'+(myDate.getMonth()+1)).slice(-2),
('0'+myDate.getDate()).slice(-2)
]。加入(“-”);
setFormula('=Query(MainSheet!A:E,“Select*其中A=\'''+jojo[A][0]+'\'和B>date\''+dateStr+'\'”,0));
var RsltRange=myrange.getA1Notation()+“:”+
mysheet.getRange(“A1”).offset(mysheet.getLastRow()-1,
mysheet.getLastColumn()-1.getA1Notation();
//复制值
spreadsheet.getRange('MainSheet!'+RsltRange.).copyTo(spreadsheet.getSheetByName(jojojo[a][0]).getRange(“a”+DestLastRow),SpreadsheetApp.copypestype.PASTE_值,false);
//复制格式
spreadsheet.getRange('MainSheet!'+RsltRange.).copyTo(spreadsheet.getSheetByName(jojojo[a][0]).getRange(“a”+DestLastRow),SpreadsheetApp.copypestype.PASTE_格式,false);
myrange.clear();
}
}
};

嘿,瓦拉兹,欢迎来到Stackoverflow!我想知道date列的一些事情:它的行为如何?同一张工作表是否可以有多行具有相同日期?还有,我想SheetA,SheetB…'s的记录也应该按此字段排序?最后,为了记录在案,请记住下次附加示例表文档而不是图像。;)嘿,卡尔,谢谢你伸出援手!回答您的问题:1)辅助工作表中的日期列是一个时间线,其中,随着一年中每个月的过去,每个月都会添加一个新条目。每个月只有一个记录。2) 是的,随着时间的推移,辅助工作表记录将按日期排序。3) 当然,我会马上看到如何附加一个示例文档:dwy你为什么不使用query,它更简单,我想Hey Kev,谢谢你的帮助。我一定无法解释自己,我会再试一次。宏的想法是将数据从主工作表复制到辅助工作表(本例中为SheetA和SheetB)中的相应单元格。主工作表上的数据将被输入。那时我得到了不同的解决方案。你想在你输入的每一行之后运行这个函数吗?比如说每天…?我每天运行这个脚本都没有问题,一旦在MainSheet中收集了大量的条目Hey Cooper,非常感谢你的时间和帮助!我马上就来试试。请注意,我附加了一个简单的方法,这是相当简单和快速的。您可以通过在工作表名称上使用switch语句,以简单的方式为不同的工作表布局执行此操作。以下是我在尝试两个脚本后的发现:1)都将新行复制到辅助工作表中,而不是使用其中已经存在的日期。这没问题,我可以很好地解决这个问题(谢谢!)。2) 我尝试在主工作表和辅助工作表(Column3)中添加第三列,但只有copyData()将其集成到流程中。出于某种原因,copyData1()忽略了新列的存在。3) 我还尝试在混合料中加入一张第三副纸(SheetC),效果非常好。非常感谢你的帮助!第二个版本是硬连接的。如果你改变了结构,你就必须改变代码。就日期问题而言,第一个版本只是复制,也许公式有问题。如果您可以共享您的工作表,我将使用MainSheet中的查询来修复它。c