我有一個腳本,當 A 列被填充時,它會填充今天的日期列 J。
function Populate() {
var sheetNameToWatch = "MASTER";
var columnNumberToWatch = /* column A */ 1;
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getActiveCell();
var val=sheet.getActiveCell().getValue()
if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && val!= "" ) {
var targetCell = sheet.getRange(range.getRow(), range.getColumn() 9
);
targetCell.setValue("" Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd"));
}
}
我認為它很慢,除了 J 列上的日期之外,我還想一次填充更多列:
- 第一欄:“不付款”
- L列:“待定”
為了填充多列并嘗試使其作業更快,我還測驗了另一個版本:
function Populate2(e)
{
var sheet = e.source.getActiveSheet();
if (sheet.getName() !== 'MASTER'|| e.range.getColumn() !== 1)
{
return;
}
for(var i=0;i<e.range.getNumRows();i )
{
var offset=e.range.getRow() i;
sheet.getRange('I' offset).setValue("No Payment");
sheet.getRange('J' offset).setValue(new Date());
sheet.getRange('L' offset).setValue("PENDING");
}
}
最后一個版本有一個問題,即使我清理了 A 列,值也會被填充。
無法弄清楚哪個版本 - 如果有的話 - 將是提高效率的最佳方法,以及如何。誰能幫我一把?先感謝您。
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想降低腳本的流程成本。
- 洗掉“A”列的值后,您要清除“I”、“J”和“L”列。
在這種情況下,如何進行以下修改?
修改后的腳本:
function Populate2(e) {
var range = e.range;
var sheet = e.source.getActiveSheet();
if (sheet.getSheetName() !== 'MASTER' || range.columnStart !== 1) {
return;
}
var values = range.getDisplayValues();
var { noPayment, date, pending, clear } = values.reduce((o, [a], i) => {
var row = range.rowStart i;
if (a == "") {
o.clear.push(...["I", "J", "L"].map(e => e row));
} else {
o.noPayment.push("I" row);
o.date.push("J" row);
o.pending.push("L" row);
}
return o;
}, { noPayment: [], date: [], pending: [], clear: [] });
if (noPayment.length > 0) {
sheet.getRangeList(noPayment).setValue("No Payment");
sheet.getRangeList(date).setValue(new Date());
sheet.getRangeList(pending).setValue("PENDING");
}
if (clear.length > 0) {
sheet.getRangeList(clear).clearContent();
}
}
- 在此修改中,使用范圍串列將值放入單元格中。而且,使用范圍串列清除單元格。
筆記:
- 根據您的問題,此修改后的腳本假定您的函式
Populate2已安裝為 OnEdit 觸發器。請注意這一點。 - 我認為在您的腳本中,
onEdit也可能使用簡單的觸發器。但是,我不確定你的實際情況。所以我Populate2在你的腳本中使用了。
參考:
- getRangeList(a1Notations)
- 類范圍串列
uj5u.com熱心網友回復:
試試這個:
function Populate2(e) {
//e.source.toast('Entry');
var sh = e.range.getSheet();
if (sh.getName() !== 'Master' || e.range.columnStart !== 1) { return; }
//e.source.toast('flag1')
let n = e.range.rowEnd - e.range.rowStart 1;
let dt = new Date();
let i = [...Array.from(new Array(n).keys(),x => ["No Payment"])];
let j = [...Array.from(new Array(n).keys(),x => [dt])];
let l = [...Array.from(new Array(n).keys(),x => ["PENDING"])];
sh.getRange(e.range.rowStart, 9, n).setValues(i);
sh.getRange(e.range.rowStart, 10, n).setValues(j);
sh.getRange(e.range.rowStart, 12, n).setValues(l);
}
或者
function Populate2(e) {
//e.source.toast('Entry');
var sh = e.range.getSheet();
if (sh.getName() !== 'Master' || e.range.columnStart !== 1) { return; }
//e.source.toast('flag1')
let n = e.range.rowEnd - e.range.rowStart 1;
let dt = new Date();
let i = [...Array.from(new Array(n).keys(),x => ["No Payment",dt])];
let l = [...Array.from(new Array(n).keys(),x => ["PENDING"])];
sh.getRange(e.range.rowStart, 9, n, 2).setValues(i);
sh.getRange(e.range.rowStart, 12, n).setValues(l);
}
Array.from()
陣列建構式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404523.html
標籤:
