只将包含B列值的行复制到新工作表中



我想用谷歌表格完成两件事。我有一个包含数据的主表,我想:

  1. 根据B列中的单元格值创建新工作表(已完成)
  2. 将包含B中值的行复制到新工作表

第1部分使用这个脚本可以正常工作:

function onOpen() {
var menu = [{
name : "Add",
functionName : "newSheet"
}
];
SpreadsheetApp.getActiveSpreadsheet().addMenu("Sheet", menu);
}
function newSheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var templateSheet = ss.getActiveSheet();
var sheet1 = ss.getSheetByName("Sheet1")
var getNames = sheet1.getRange("B2:B").getValues().filter(String).toString().split(",");
for (var i = 0; i < getNames.length; i++) {
var copy = ss.getSheetByName(getNames[i]);
if (copy) {
Logger.log("Sheet already exists");
} else {
templateSheet.copyTo(ss).setName(getNames[i]);
ss.setActiveSheet(ss.getSheetByName(getNames[i]));
ss.moveActiveSheet(ss.getNumSheets());
}
}
}

问题是当创建新工作表时,它会复制主工作表的内容。我只希望将包含B列值的行复制到新工作表中。

不使用copyTo,您可以使用类电子表格的insertSheet方法之一,然后将B列中具有所需值的行复制到新工作表中。

复制行的具体代码取决于真正需要复制的内容(值、显示值、公式、单元格格式、富文本单元格内容格式、注释、数据验证、条件格式)

假设您只对传递值感兴趣,您可以在getNamesfor循环中使用以下内容:
var data = sheet1.getDataRange().getValues().filter(row => row[1] === getNames[i])
var newSheet = ss.insertSheet(getNames[i]);
if( data.length > 0 ) newSheet.getRange(1,1,data.length,data[0].length).setValues(data);

相关的

  • insertSheet高级选项
  • 检查谷歌电子表格中是否存在表格

您可以添加一个函数来从任何工作表中删除冗余行。像这样:

function main() {
var sheet = SpreadsheetApp.getActiveSheet()
remove_rows("aaa", sheet); // remove all rows, that contain 'aaa' in first column
}
function remove_rows(value, sheet) {
var data = sheet.getDataRange().getValues();
var new_data = data.filter(x => x[0].indexOf(value)>=0)
sheet.getDataRange().clearContent();
sheet.getRange(1,1,new_data.length,new_data[0].length).setValues(new_data);
}

相关内容

最新更新