App-Scripts 如何根据条件删除和保留一些行
App-Scripts How to delete and keep some rows based on conditions
我将使用 google 张而不是 excel。所以我遇到了一些关于编码的问题。这个问题我以前问过。
假设我有连续两天的数据(早、晚),有 25 列和超过 50K 行
我想保留一些符合条件的数据并删除我不需要的其他数据。
例子。我想从早期删除 'AAA'、'BBB'、'DDD'、'FFF' 并保留其他 'CCC'、'EEE'、'GGG' .
稍后我想保留 'AAA'、'BBB'、'DDD'、'FFF' 并删除其他
enter image description here
结果会是这样的
enter image description here
这是我试过的代码,但没有 运行 得到结果。
//text data in D, dates to evaluate earlyDay/lateDay in C
var Offset = 1;
function deleteRows() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r = targetSheet.getRange('C:C');
var v = r.getValues();
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
var lateDay = new Date(getLateDay()).getTime();
var earlyDay = new Date(getEarlyDay()).getTime();
for(var i = f.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
if(tmp==earlyDay && (f[0,i]=="AAA" || f[0, i]=="BBB")){
targetSheet.deleteRow(i+1);
}
}
for(var i = f.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
if(tmp==lateDay && (f[0,i]!="AAA" && f[0, i]!="BBB")){
targetSheet.deleteRow(i+1);
}
}
}
function getLateDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r = targetSheet.getRange('C:C');
var v = r.getValues();
for(var i = v.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
var tmp1 = new Date(v[0,i-1]).getTime();
if(tmp>tmp1){
return tmp;
}
}
return null;
}
function getEarlyDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r = targetSheet.getRange('C:C');
var v = r.getValues();
for(var i = v.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
var tmp1 = new Date(v[0,i-1]).getTime();
if(tmp<tmp1){
return tmp;
}
}
return null;
}
OP 代码存在一些基本语法和逻辑缺陷。使用 Logger 命令进行故障排除可能有助于 OP 识别问题。
1) 使用了错误的语法来访问数组的值。例如,getLateDay
使用 v[0,i]
;这里有两个问题。
- 数组的两个元素都必须在方括号中 (
[0][i]
),
- 它正在查询错误的元素。而不是[0][i],应该是[i][0].
2) getLateDay
和 getEarlyDay
正在查询 C 列中的值。相反,他们应该查询 D 列(日期列)。
3) getLateDay
和 getEarlyDay
都应该评估 if(tmp>tmp1)
。但是 getLateDay
应该 return "tmp" 而 getEarlyDay
应该 return "tmp1"。
4) getLateDay
和 getEarlyDay
重复了大部分主要代码,并且在很大程度上是相同的。为了性能,它们可以很容易地合并到主代码中。
5) 只需要一个循环来评估 EarlyDay/LateDay 与 "tmp",当然适用于 EarlyDay 和 LateDay 的 alpha 代码条件需要单独评估。我还发现,为 LateDay 保留的值最好在一系列 IF 语句中进行评估。可以删除整个第二个循环。
6) 如果不使用 C 列和 D 列的单独范围,而是为组合列声明单个范围和值,则可能不会那么混乱,并且可以节省一些处理时间。随着 OP 任务的增长并且他们正在处理 25 列,这将变得更加重要。
我修改了 OP 的代码以解决这些评论。我在代码中留下了几个 Logger 语句,以便 OP 可以在代码的不同状态下评估变量。
//text data in D, dates to evaluate earlyDay/lateDay in C
var Offset = 1;
function deleteRows() {
// set up the spreadsheet
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
// define the data ranges and get values
var r = targetSheet.getRange('C:C');
var v = r.getValues();
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
//Logger.log("DEBUG: code: "+v[0][0]+", date: "+f[0][0].getTime());//DEBUG
//Logger.log("DEBUG: length of f: "+f.length);//DEBUG
// get the respective values for lateDay and earlyDay
var lateDay = new Date(getLateDay()).getTime();
var earlyDay = new Date(getEarlyDay()).getTime();
//Logger.log("DEBUG: LateDay: "+lateDay+", EarlyDay: "+earlyDay); //DEBUG
// Loop through the data, starting at te bottom.
for (var i = f.length - 1; i > -1; i--) {
// get the date for this row
var tmp = new Date(f[i][0]).getTime();
// evaluate if this row is early and the values of possible codes
if (tmp == earlyDay && (v[i][0] == "AAA" || v[i][0] == "BBB" || v[i][0] == "DDD" || v[i][0] == "FFF")) {
Logger.log("DEBUG: Option#1 i: " + i + ", row: " + (i + 1) + "- delete row , earlyDay: " + earlyDay + ", tmp: " + tmp + ", code: " + v[i][0]); //DEBUG
// Note the row deleted is "i+1" because the deleteRow command matchs the actual row number, whereas the loop works on a zero-basis.
targetSheet.deleteRow(i + 1);
} else {
//Logger.log("DEBUG: Option#1 - do nothing");//DEBUG
}
// evaluate if this row is late and the values of possible codes
// Note this is an either or; a day cannot be both early and late
if (tmp == lateDay) {
Logger.log("today is Late Day");
if (v[i][0] != "FFF") {
if (v[i][0] != "DDD") {
if (v[i][0] != "BBB") {
if (v[i][0] != "AAA") {
Logger.log("DEBUG: code <> AAA or BBB or DDD or FFF"); //DEBUG
Logger.log("DEBUG: Option#2 i: " + i + ", row: " + (i + 1) + "- delete row , lateDay: " + lateDay + ", tmp: " + tmp + ", code: " + v[i][0]); //DEBUG
targetSheet.deleteRow(i + 1);
} else {
//Logger.log("DEBUG: Option#2 - do nothing");//DEBUG
}
}
}
}
}
}
}
function getLateDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
for (var i = f.length - 1; i > -1; i--) {
var tmp = new Date(f[i][0]).getTime();
var tmp1 = new Date(f[i - 1][0]).getTime();
//Logger.log("DEBUG: LateDay: i: "+i+", this day: "+tmp+", yesterday: "+tmp1);//DEBUG
if (tmp > tmp1) {
//Logger.log("DEBUG: return this day: "+tmp);//DEBUG
return tmp;
}
}
//Logger.log("DEBUG: return null");
return null;
}
function getEarlyDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
for (var i = f.length - 1; i > -1; i--) {
var tmp = new Date(f[i][0]).getTime();
var tmp1 = new Date(f[i - 1][0]).getTime();
//Logger.log("DEBUG: EarlyDay: i: "+i+", tmp: "+tmp+", tmp1: "+tmp1);//DEBUG
if (tmp > tmp1) {
//Logger.log("DEBUG: return this day: "+tmp1);//DEBUG
return tmp1;
}
}
//Logger.log("DEBUG: return null");//DEBUG
return null;
}
之前和之后的截图
我将使用 google 张而不是 excel。所以我遇到了一些关于编码的问题。这个问题我以前问过。
假设我有连续两天的数据(早、晚),有 25 列和超过 50K 行 我想保留一些符合条件的数据并删除我不需要的其他数据。
例子。我想从早期删除 'AAA'、'BBB'、'DDD'、'FFF' 并保留其他 'CCC'、'EEE'、'GGG' . 稍后我想保留 'AAA'、'BBB'、'DDD'、'FFF' 并删除其他
enter image description here
结果会是这样的 enter image description here
这是我试过的代码,但没有 运行 得到结果。
//text data in D, dates to evaluate earlyDay/lateDay in C
var Offset = 1;
function deleteRows() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r = targetSheet.getRange('C:C');
var v = r.getValues();
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
var lateDay = new Date(getLateDay()).getTime();
var earlyDay = new Date(getEarlyDay()).getTime();
for(var i = f.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
if(tmp==earlyDay && (f[0,i]=="AAA" || f[0, i]=="BBB")){
targetSheet.deleteRow(i+1);
}
}
for(var i = f.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
if(tmp==lateDay && (f[0,i]!="AAA" && f[0, i]!="BBB")){
targetSheet.deleteRow(i+1);
}
}
}
function getLateDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r = targetSheet.getRange('C:C');
var v = r.getValues();
for(var i = v.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
var tmp1 = new Date(v[0,i-1]).getTime();
if(tmp>tmp1){
return tmp;
}
}
return null;
}
function getEarlyDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r = targetSheet.getRange('C:C');
var v = r.getValues();
for(var i = v.length-1; i>=Offset; i--){
var tmp = new Date(v[0,i]).getTime();
var tmp1 = new Date(v[0,i-1]).getTime();
if(tmp<tmp1){
return tmp;
}
}
return null;
}
OP 代码存在一些基本语法和逻辑缺陷。使用 Logger 命令进行故障排除可能有助于 OP 识别问题。
1) 使用了错误的语法来访问数组的值。例如,getLateDay
使用 v[0,i]
;这里有两个问题。
- 数组的两个元素都必须在方括号中 (
[0][i]
), - 它正在查询错误的元素。而不是[0][i],应该是[i][0].
2) getLateDay
和 getEarlyDay
正在查询 C 列中的值。相反,他们应该查询 D 列(日期列)。
3) getLateDay
和 getEarlyDay
都应该评估 if(tmp>tmp1)
。但是 getLateDay
应该 return "tmp" 而 getEarlyDay
应该 return "tmp1"。
4) getLateDay
和 getEarlyDay
重复了大部分主要代码,并且在很大程度上是相同的。为了性能,它们可以很容易地合并到主代码中。
5) 只需要一个循环来评估 EarlyDay/LateDay 与 "tmp",当然适用于 EarlyDay 和 LateDay 的 alpha 代码条件需要单独评估。我还发现,为 LateDay 保留的值最好在一系列 IF 语句中进行评估。可以删除整个第二个循环。
6) 如果不使用 C 列和 D 列的单独范围,而是为组合列声明单个范围和值,则可能不会那么混乱,并且可以节省一些处理时间。随着 OP 任务的增长并且他们正在处理 25 列,这将变得更加重要。
我修改了 OP 的代码以解决这些评论。我在代码中留下了几个 Logger 语句,以便 OP 可以在代码的不同状态下评估变量。
//text data in D, dates to evaluate earlyDay/lateDay in C
var Offset = 1;
function deleteRows() {
// set up the spreadsheet
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
// define the data ranges and get values
var r = targetSheet.getRange('C:C');
var v = r.getValues();
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
//Logger.log("DEBUG: code: "+v[0][0]+", date: "+f[0][0].getTime());//DEBUG
//Logger.log("DEBUG: length of f: "+f.length);//DEBUG
// get the respective values for lateDay and earlyDay
var lateDay = new Date(getLateDay()).getTime();
var earlyDay = new Date(getEarlyDay()).getTime();
//Logger.log("DEBUG: LateDay: "+lateDay+", EarlyDay: "+earlyDay); //DEBUG
// Loop through the data, starting at te bottom.
for (var i = f.length - 1; i > -1; i--) {
// get the date for this row
var tmp = new Date(f[i][0]).getTime();
// evaluate if this row is early and the values of possible codes
if (tmp == earlyDay && (v[i][0] == "AAA" || v[i][0] == "BBB" || v[i][0] == "DDD" || v[i][0] == "FFF")) {
Logger.log("DEBUG: Option#1 i: " + i + ", row: " + (i + 1) + "- delete row , earlyDay: " + earlyDay + ", tmp: " + tmp + ", code: " + v[i][0]); //DEBUG
// Note the row deleted is "i+1" because the deleteRow command matchs the actual row number, whereas the loop works on a zero-basis.
targetSheet.deleteRow(i + 1);
} else {
//Logger.log("DEBUG: Option#1 - do nothing");//DEBUG
}
// evaluate if this row is late and the values of possible codes
// Note this is an either or; a day cannot be both early and late
if (tmp == lateDay) {
Logger.log("today is Late Day");
if (v[i][0] != "FFF") {
if (v[i][0] != "DDD") {
if (v[i][0] != "BBB") {
if (v[i][0] != "AAA") {
Logger.log("DEBUG: code <> AAA or BBB or DDD or FFF"); //DEBUG
Logger.log("DEBUG: Option#2 i: " + i + ", row: " + (i + 1) + "- delete row , lateDay: " + lateDay + ", tmp: " + tmp + ", code: " + v[i][0]); //DEBUG
targetSheet.deleteRow(i + 1);
} else {
//Logger.log("DEBUG: Option#2 - do nothing");//DEBUG
}
}
}
}
}
}
}
function getLateDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
for (var i = f.length - 1; i > -1; i--) {
var tmp = new Date(f[i][0]).getTime();
var tmp1 = new Date(f[i - 1][0]).getTime();
//Logger.log("DEBUG: LateDay: i: "+i+", this day: "+tmp+", yesterday: "+tmp1);//DEBUG
if (tmp > tmp1) {
//Logger.log("DEBUG: return this day: "+tmp);//DEBUG
return tmp;
}
}
//Logger.log("DEBUG: return null");
return null;
}
function getEarlyDay() {
var app = SpreadsheetApp.getActiveSpreadsheet();
var targetSheet = app.getSheetByName('Sheet1');
var r1 = targetSheet.getRange('D:D');
var f = r1.getValues();
for (var i = f.length - 1; i > -1; i--) {
var tmp = new Date(f[i][0]).getTime();
var tmp1 = new Date(f[i - 1][0]).getTime();
//Logger.log("DEBUG: EarlyDay: i: "+i+", tmp: "+tmp+", tmp1: "+tmp1);//DEBUG
if (tmp > tmp1) {
//Logger.log("DEBUG: return this day: "+tmp1);//DEBUG
return tmp1;
}
}
//Logger.log("DEBUG: return null");//DEBUG
return null;
}
之前和之后的截图