我相信你的目标如下。
这样的话,下面的修改怎么样?
修改脚本:
function CopyPendingPayment() {
var sheet = SpreadsheetApp.getActive();
var sourceSheet = sheet.getSheetByName("Alerts");
var destination = sheet.getSheetByName("MASTER");
// I modified below script.
var srcValues = sourceSheet.getRange("A3:H" + sourceSheet.getLastRow()).getValues();
var lastRow = destination.getLastRow();
var obj = srcValues.reduce((o, [a,,,,,,g,h], i) => {
if (a == "" && h >= 45) {
o.values.push([g]);
o["No Payment Received"].push(`I${lastRow + i + 1}`);
o["date"].push(`J${lastRow + i + 1}`, `N${lastRow + i + 1}`);
o["PENDING"].push(`L${lastRow + i + 1}`);
o["- Reminder sent"].push(`M${lastRow + i + 1}`);
}
return o;
}, {values: [], "No Payment Received": [], "date": [], "PENDING": [], "- Reminder sent": []});
destination.getRange(lastRow + 1, 1, obj.values.length).setValues(obj.values);
["No Payment Received", "date", "PENDING", "- Reminder sent"].forEach(e => destination.getRangeList(obj[e]).setValue(e == "date" ? new Date() : e));
}
-
在此修改中,将“A”列的值与 Class Range 的setValues 放在一起。并且,列“I”、“J”、“L”、“M”和“N”的值被放入类 RangeList 的setValue。因为我认为您可能想保留其他列。
-
作为另一种方法,我认为您的目标也可以通过覆盖目标工作表的单元格来实现。那么,下面的脚本呢?
function CopyPendingPayment() {
var sheet = SpreadsheetApp.getActive();
var sourceSheet = sheet.getSheetByName("Alerts");
var destination = sheet.getSheetByName("MASTER");
var srcValues = sourceSheet.getRange("A3:H" + sourceSheet.getLastRow()).getValues();
var lastRow = destination.getLastRow();
var values = srcValues.reduce((ar, [a,,,,,,g,h], i) => {
if (a == "" && h >= 45) {
var date = new Date();
ar.push([g,,,,,,,,"No Payment Received", date,,"PENDING","- Reminder sent",date]);
}
return ar;
}, []);
destination.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values);
}
参考资料:
补充:
根据您的以下回复,
确实,它看起来要快得多。我已经测试了你的版本和我的版本。唯一的问题是,如果在任何其他目标工作表列中有一个数组,则值将粘贴在下面。原始版本考虑到这一点,并将值粘贴到 A 列的第一个空白单元格中。
下面的示例脚本怎么样?
示例脚本:
function CopyPendingPayment_C() {
// This is from https://stackoverflow.com/a/44563639
Object.prototype.get1stEmptyRowFromTop = function (columnNumber, offsetRow = 1) {
const range = this.getRange(offsetRow, columnNumber, 2);
const values = range.getDisplayValues();
if (values[0][0] && values[1][0]) {
return range.getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() + 1;
} else if (values[0][0] && !values[1][0]) {
return offsetRow + 1;
}
return offsetRow;
};
var sheet = SpreadsheetApp.getActive();
var sourceSheet = sheet.getSheetByName("Alerts");
var destination = sheet.getSheetByName("MASTER");
// I modified below script.
var srcValues = sourceSheet.getRange("A3:H" + sourceSheet.getLastRow()).getValues();
var lastRow = destination.get1stEmptyRowFromTop(1) - 1;
// I modified below part.
var obj = srcValues.reduce((o, [a,,,,,,g,h]) => {
if (a == "" && h >= 45) {
o.offset++;
o.values.push([g]);
o["No Payment Received"].push(`I${o.offset}`);
o["date"].push(`J${o.offset}`, `N${o.offset}`);
o["PENDING"].push(`L${o.offset}`);
o["- Reminder sent"].push(`M${o.offset}`);
}
return o;
}, {values: [], "No Payment Received": [], "date": [], "PENDING": [], "- Reminder sent": [], offset: lastRow});
destination.getRange(lastRow + 1, 1, obj.values.length).setValues(obj.values);
["No Payment Received", "date", "PENDING", "- Reminder sent"].forEach(e => destination.getRangeList(obj[e]).setValue(e == "date" ? new Date() : e));
}