根据单元格的值复制并粘贴一行
Copy and paste a row based on a cell's value
我有这个sheet:https://puu.sh/ISskB/7329c743ce.png
基本上我想要的只是将包含列 F2:F1000>20% 的所有行复制并粘贴到另一个 sheet 中。我计划将此脚本安排为每天 运行 一次,因此它不应覆盖前几天粘贴的任何数据。
谢谢
可以是这样的:
function set_trigger() {
ScriptApp.newTrigger("main").timeBased().everyDays(1).create();
}
function main() {
copy_all_rows_to_dest_sheet();
remove_redundant_rows();
}
function copy_all_rows_to_dest_sheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var src_sheet = ss.getSheetByName('Sheet1');
var src_range = src_sheet.getDataRange();
var dest_sheet = ss.getSheetByName('Sheet2');
var dest_range = dest_sheet.getRange(dest_sheet.getLastRow()+1,1);
src_range.copyTo(dest_range);
}
function remove_redundant_rows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet2');
var data = sheet.getDataRange().getValues();
// get indexes of redundant rows
var rows = data.map(x => x.slice(0,-1).join());
var indexes = [];
var i = 0;
while (rows.length) {
var row = rows.shift();
// var percent = data[i].pop();
var percent = data[i][5]; // <---------------------- update
if (percent < .2 || rows.includes(row)) indexes.push(i);
i++;
}
// remove the rows by the indexes
while (indexes.length) sheet.deleteRow(indexes.pop()+1);
}
如果您 运行 函数 set_trigger()
它将每天 运行 函数 main()
。
函数 main()
复制 sheet 'Sheet1' 中的所有行到 sheet 'Sheet2' 的末尾并删除所有重复的行和最后一列中值小于 20% 的所有行。
更新
这是不保留格式的主要函数的变体(它从目标 sheet 获取所有格式):
function main_no_formatting() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var src_sheet = ss.getSheetByName('Sheet1');
var src_range = src_sheet.getDataRange();
var [header, ...src_data] = src_range.getValues();
var dest_sheet = ss.getSheetByName('Sheet2');
var dest_range = dest_sheet.getDataRange();
var [_, ...dest_data] = dest_range.getValues();
var data = [...src_data, ...dest_data];
var rows = data.map(x => x.join());
var filtered_data = [];
for (var i=0; i<data.length; i++) {
var row = rows.shift();
var percent = data[i][5];
if (percent < .2) continue;
if (rows.includes(row)) continue;
filtered_data.push(data[i])
}
var table = [header, ...filtered_data];
dest_sheet.clear();
dest_sheet.getRange(1,1,table.length,table[0].length).setValues(table);
}
小心 %
标志。如果它们从目的地消失 sheet,代码将无法使用。
我的 sheet 是 here。
我有这个sheet:https://puu.sh/ISskB/7329c743ce.png
基本上我想要的只是将包含列 F2:F1000>20% 的所有行复制并粘贴到另一个 sheet 中。我计划将此脚本安排为每天 运行 一次,因此它不应覆盖前几天粘贴的任何数据。
谢谢
可以是这样的:
function set_trigger() {
ScriptApp.newTrigger("main").timeBased().everyDays(1).create();
}
function main() {
copy_all_rows_to_dest_sheet();
remove_redundant_rows();
}
function copy_all_rows_to_dest_sheet() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var src_sheet = ss.getSheetByName('Sheet1');
var src_range = src_sheet.getDataRange();
var dest_sheet = ss.getSheetByName('Sheet2');
var dest_range = dest_sheet.getRange(dest_sheet.getLastRow()+1,1);
src_range.copyTo(dest_range);
}
function remove_redundant_rows() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet2');
var data = sheet.getDataRange().getValues();
// get indexes of redundant rows
var rows = data.map(x => x.slice(0,-1).join());
var indexes = [];
var i = 0;
while (rows.length) {
var row = rows.shift();
// var percent = data[i].pop();
var percent = data[i][5]; // <---------------------- update
if (percent < .2 || rows.includes(row)) indexes.push(i);
i++;
}
// remove the rows by the indexes
while (indexes.length) sheet.deleteRow(indexes.pop()+1);
}
如果您 运行 函数 set_trigger()
它将每天 运行 函数 main()
。
函数 main()
复制 sheet 'Sheet1' 中的所有行到 sheet 'Sheet2' 的末尾并删除所有重复的行和最后一列中值小于 20% 的所有行。
更新
这是不保留格式的主要函数的变体(它从目标 sheet 获取所有格式):
function main_no_formatting() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var src_sheet = ss.getSheetByName('Sheet1');
var src_range = src_sheet.getDataRange();
var [header, ...src_data] = src_range.getValues();
var dest_sheet = ss.getSheetByName('Sheet2');
var dest_range = dest_sheet.getDataRange();
var [_, ...dest_data] = dest_range.getValues();
var data = [...src_data, ...dest_data];
var rows = data.map(x => x.join());
var filtered_data = [];
for (var i=0; i<data.length; i++) {
var row = rows.shift();
var percent = data[i][5];
if (percent < .2) continue;
if (rows.includes(row)) continue;
filtered_data.push(data[i])
}
var table = [header, ...filtered_data];
dest_sheet.clear();
dest_sheet.getRange(1,1,table.length,table[0].length).setValues(table);
}
小心 %
标志。如果它们从目的地消失 sheet,代码将无法使用。
我的 sheet 是 here。