Anj*_*ali 4 javascript arrays for-loop google-sheets google-apps-script
我试图循环遍历电子表格中的行,并确定特定行是否具有关键字“hello”,并将整行移动到新的电子表格中。
我尝试了以下代码。该代码适用于第一行,但不会循环并在第一行之后停止。将范围选择扩展到“C1:E32”并没有帮助。
function Edit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activatedSheetName = ss.getActiveSheet().getName();
var ActiveSheet = ss.getSheetByName("ActiveSheet"); // source sheet
var MoveDatatoThisSheet = ss.getSheetByName("MoveDatatoThisSheet"); // target sheet
var re = new RegExp(/(Hello)/i);
var startRow = 1;
var endRow = ss.getLastRow();
var getRange = ss.getDataRange();
var getRow = getRange.getRow();
for (var ree = startRow; ree <= endRow; ree++) {
// if the value in column D is "Approved", move the row to target sheet
cellValue = ss.getRange("C1:E1");
if (cellValue.getValue().match(re)) {
// insert a new row at the second row of the target sheet
MoveDatatoThisSheet.insertRows(2, 1);
// move the entire source row to the second row of target sheet
var rangeToMove = ActiveSheet.getRange(/*startRow*/ getRow, /*startColumn*/ 1, /*numRows*/ 1, /*numColumns*/ ActiveSheet.getMaxColumns());
rangeToMove.moveTo(MoveDatatoThisSheet.getRange("A2"));
// add date and time of when approved to target row in column E
MoveDatatoThisSheet.getRange("E2").setValue(Date());
// delete row from source sheet
ActiveSheet.deleteRow(cellValue, 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您的循环从不使用变量ree,它只使用cellValue = ss.getRange("C1:E1").
另一个问题是删除会移动已删除行下的行,可能导致后续操作作用于错误的行。当您遍历一组行并删除其中一些行时,请自下而上而不是自上而下。
for (var ree = endRow; ree >= startRow; ree--) {
var rangeToCheck = ss.getRange(ree, 3, 1, 3); // 3 columns starting with column 3, so C-E range
if (rangeToCheck.getValues()[0].join().match(re)) { // joining values before checking the expression
MoveDatatoThisSheet.insertRows(2,1);
var rangeToMove = ActiveSheet.getRange(/*startRow*/ getRow, /*startColumn*/ 1, /*numRows*/ 1, /*numColumns*/ ActiveSheet.getMaxColumns());
rangeToMove.moveTo(MoveDatatoThisSheet.getRange("A2"));
// add date and time of when approved to target row in column E
MoveDatatoThisSheet.getRange("E2").setValue(Date());
// delete row from source sheet
ActiveSheet.deleteRow(ree);
}
}
Run Code Online (Sandbox Code Playgroud)
如果目标是仅检查 D 列(例如),则代码会稍微简化
var rangeToCheck = ss.getRange(ree, 4); // column D in row ree
if (rangeToCheck.getValue().match(re)) { // joining values before checking the expression
Run Code Online (Sandbox Code Playgroud)
正如Google 建议的那样,应该避免多次调用 getValues / setValues 等,而是一次获取所有必要的数据,对其进行处理,并立即进行批量更改。例如,不要将其放在另一张纸中的一行,而是将其添加到数组中;当循环结束时,将整个数组放入该表中。
| 归档时间: |
|
| 查看次数: |
34884 次 |
| 最近记录: |