我看了Google Script: Conditionally copy rows from one spreadsheet to another并且无法让它对我有用。
我需要一个脚本,允许我在下面做引用的文字。请随时编辑my spreadsheet以制作完整的工作脚本。我会公开电子表格供任何人复制脚本供自己使用。我对剧本写作一无所知,所以我需要拼写出来。对不起,我是这样的一个菜鸟,但这将有助于我学习。
https://docs.google.com/spreadsheet/ccc?key=0AoJdwy8V1ldHdFA5M1M1Wlp1NHZhcmxJOUZKVEU4X3c&usp=sharing
如果工作表“All_Mileage”上的B列表示“John”,那么我想要该行 从第3行开始复制并粘贴到Sheet“John”中。
如果工作表“All_Mileage”上的B列说“Adam”,那么我想要那行 从第3行开始复制并粘贴到Sheet“Adam”中。
如果工作表“All_Mileage”上的B列说“Mike”,那么我想要那行 从第3行开始复制并粘贴到Sheet“Mike”中。
我在这里看到了其他脚本,但我无法让它们工作。就像我说的那样,当它来代码时,我比树苗更绿。
非常感谢!
答案 0 :(得分:10)
var ss=SpreadsheetApp.getActiveSpreadsheet();// some global variables
var master = ss.getSheetByName('All_Mileage');
var colWidth = master.getMaxColumns();
function copyRowsOnCondition() {
var data = master.getDataRange().getValues();
for(n=2;n<data.length;++n){
if(data[n][1].length<16){ // if not pre-filled with your text
Logger.log(data[n][1])
var dest = ss.getSheetByName(data[n][1].toString().replace(/ /g,''));//remove any spaces that could be included in the name so the name = sheetName for sure
var destRange = dest.getRange(dest.getLastRow()+1,1);// the place to write
master.getRange(n+1,1,1,colWidth).copyTo(destRange);the copy itself value & format
}
}// loop
}
编辑:,因为我使用MasterSheet中的名称值来查找目标表单我认为通过使用相同的规则创建目标表单不存在可能是有用的,即。 name = sheetName
...
另一个问题是无法知道哪些行已被复制...所以我创建了一个处理所有这些行的版本,只复制手动选择的行(即使只在一列中)更改背景颜色以告知这些行已被处理。我还添加了一个最小舒适度的菜单; - )
(如何在寒冷的星期天下午保持忙碌; - )
var ss=SpreadsheetApp.getActiveSpreadsheet();
var master = ss.getSheetByName('All_Mileage');
var colWidth = master.getLastColumn();// last used col in masterSheet
var sheets = ss.getSheets();// number of sheets
function onOpen() {
var menuEntries = [ {name: "Copy selected Rows to sheets", functionName: "copyRowsOnConditionV2"},
];
ss.addMenu("Copy functions",menuEntries);// custom menu
}
function copyRowsOnConditionV2() {
var sheetNames = [];// array of existing sheet names
var sheets = ss.getSheets();// number of sheets
for(s=0;s<sheets.length;++s){sheetNames.push(sheets[s].getName())};
ss.getActiveSelection().setBackground('#ffffbb');
var selectedfirstRow = ss.getActiveSelection().getRowIndex();
var selectedHeigth = ss.getActiveSelection().getHeight()
var selectedFullRange = master.getRange(selectedfirstRow,1,selectedHeigth,colWidth);
var data = selectedFullRange.getValues();
for(n=0;n<data.length;++n){
if(data[n][1].length<16){
if(sheetNames.toString().match(data[n][1].toString().replace(/ /g,''))!=data[n][1].toString().replace(/ /g,'')){// if no sheet exist with this name
var newSheet = ss.insertSheet(data[n][1].toString().replace(/ /g,''),ss.getSheets().length);// then create it
master.getRange(1,1,2,colWidth).copyTo(newSheet.getRange(1,1));// and copy the headers on 2 first rows, then continue as usual
newSheet.getRange(1,1).setValue('Gas Mileage Log - '+data[n][1].toString().replace(/ /g,''));// set name in header
SpreadsheetApp.flush();
var sheets = ss.getSheets();// number of sheets
var sheetNames = [];// update array of existing sheet names
for(s=1;s<sheets.length;++s){sheetNames.push(sheets[s].getName())};
Logger.log(sheetNames)
};
var dest = ss.getSheetByName(data[n][1].toString().replace(/ /g,''));//find the destination sheet
Logger.log(data[n][1].toString().replace(/ /g,''))
var destRange = dest.getRange(dest.getLastRow()+1,1);// define range
master.getRange(selectedfirstRow+n,1,1,colWidth).copyTo(destRange);// and make copy below last row
}
}
}
下图: