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列
---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