第一次在这里发布,对编写Google脚本非常陌生,因此,我感谢能获得的任何帮助。
我正在尝试设计一个宏,并经历了一些线程,但是没有找到合适的东西。我已经尝试过将程序设计为程序友好的,希望能对您有所帮助。设置如下:
单个电子表格,多个电子表格。 MainSheet和数量不断增加的辅助工作表(在示例中,存在SheetA和SheetB)Example Sheet Structure
MainSheet的列结构为:SheetName,Date,Column1,Column2。辅助工作表的列结构始终相同:日期,列1,列2。 MainSheet Column Structure Secondary Sheet Column Structure
该宏用于从MainSheet的Column1和Column2复制数据,并根据SheetName和Date列上提供的信息,将其粘贴到辅助工作表的相应单元格上。对MainSheet上的每个条目重复此过程。
这里我是该过程的图像示例:Example MainSheet Example SheetA Example SheetB
再次,我将尽我所能提供的帮助。非常感谢你!
编辑:这是示例Google表格电子表格的Link。
--- Valraz
答案 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();
}
}
};