下面的代碼一直在作業,但恐怕還有幾千行,它可能會變得遲鈍,我想知道改進它的方法是什么。
它基本上通過兩個資料集共同的數字來比較兩個資料集,并使用它們的狀態/復選框(TRUE 或 FALSE)更新幾列:
function onEdit(e) {
if (e.range.getSheet().getName() === 'Todays Tests V2' && e.range.getA1Notation() === 'C3') {
var formRespSheet = e.source.getSheetByName('Form Responses 1');
var formRespRng = formRespSheet.getRange(2, 13, formRespSheet.getLastRow() - 1, 4);
var formRespValues = formRespRng.getValues();
var todaysTest = e.source.getSheetByName('Todays Tests V2');
var todaysTestData = todaysTest.getRange(6, 1, todaysTest.getLastRow(), 18).getValues();
todaysTest.getRange('O6:O').clearContent();
todaysTest.getRange('Q6:Q').clearContent();
todaysTest.getRange('R6:R').clearContent();
for (var i = 0; i < formRespValues.length; i ) {
for (var j = 0; j < todaysTestData.length; j )
if (formRespValues[i][1] == todaysTestData[j][1]) {
if (formRespValues[i][0] == 'Yes') {
todaysTest.getRange('O' (6 j)).setValue('TRUE')
} else {
todaysTest.getRange('O' (6 j)).setValue('FALSE')
}
if (formRespValues[i][2] == 'Yes') {
todaysTest.getRange('Q' (6 j)).setValue('TRUE')
} else {
todaysTest.getRange('Q' (6 j)).setValue('FALSE')
}
if (formRespValues[i][3] == 'Yes') {
todaysTest.getRange('R' (6 j)).setValue('TRUE')
} else {
todaysTest.getRange('R' (6 j)).setValue('FALSE')
}
}
}
uj5u.com熱心網友回復:
我看到@MisterJojo 的回答可以進一步改進一些事情,請參閱下面的修改:
修改:
function onEdit(e) {
if (e.range.getSheet().getName() === 'Todays Tests V2' &&
e.range.getA1Notation() === 'C3') {
let formRespSheet = e.source.getSheetByName('Form Responses 1'),
formRespRng = formRespSheet.getRange(2, 13, formRespSheet.getLastRow() - 1, 4),
formRespValues = formRespRng.getValues(),
todaysTest = e.source.getSheetByName('Todays Tests V2'),
todaysTestNumRows = todaysTest.getLastRow() - 5,
todaysTestData = todaysTest.getRange(6, 1, todaysTestNumRows, 18).getValues();
// this can be replaced with getValues if it feels sluggish
var inputB = todaysTestData.map(x => x[1]),
outputO = todaysTestData.map(x => [x[14]]),
outputQR = todaysTestData.map(x => [x[16], x[17]]);
for (const frv of formRespValues) {
let frv0test = (frv[0] == 'Yes') ? 'TRUE' : 'FALSE',
frv2test = (frv[2] == 'Yes') ? 'TRUE' : 'FALSE',
frv3test = (frv[3] == 'Yes') ? 'TRUE' : 'FALSE';
let index = inputB.indexOf(frv[1]);
if (index > -1) {
outputO[index] = [frv0test];
outputQR[index] = [frv2test, frv3test];
}
}
// write by bulk
todaysTest.getRange(6, 15, outputO.length, outputO[0].length).setValues(outputO);
todaysTest.getRange(6, 17, outputQR.length, outputQR[0].length).setValues(outputQR);
}
}
變更摘要:
todaysTestData通過減去 5修復了不正確的最后一行值。- 已洗掉
clearContent,因為您FALSE在空白單元格之后寫入,該單元格基本上洗掉了復選框中的勾號。 - 而是用于
map減少對SpreadsheetApp. 如果您看到更好的性能map,可以替換這些功能。getValuesgetValues - 而不是回圈你的
todaysTestData,只需使用indexOf檢查frv[1]在 columnB 上找到的索引todaysTestData(如果有的話)并使用該索引在那里寫入資料。 - 使用批量寫入
setValues而不是回圈setValue。 - 結合寫作
Q,R因為它們是相鄰的列。
uj5u.com熱心網友回復:
試試那個...
function onEdit(e)
{
if ( e.range.getSheet().getName() === 'Todays Tests V2'
&& e.range.getA1Notation() === 'C3')
{
let
formRespSheet = e.source.getSheetByName('Form Responses 1')
, formRespRng = formRespSheet.getRange(2, 13, formRespSheet.getLastRow() - 1, 4)
, formRespValues = formRespRng.getValues()
, todaysTest = e.source.getSheetByName('Todays Tests V2')
, todaysTestData = todaysTest.getRange(6, 1, todaysTest.getLastRow(), 18).getValues()
;
todaysTest.getRange('O6:O').clearContent();
todaysTest.getRange('Q6:Q').clearContent();
todaysTest.getRange('R6:R').clearContent();
for (const frv of formRespValues)
{
let
frv0test = (frv[0] == 'Yes') ? 'TRUE' : 'FALSE'
, frv2test = (frv[2] == 'Yes') ? 'TRUE' : 'FALSE'
, frv3test = (frv[3] == 'Yes') ? 'TRUE' : 'FALSE'
;
todaysTestData.forEach( (ttd,j) =>
{
if (frv[1] == ttd[1])
{
let j6 = j 6
todaysTest.getRange(`O${j6}`).setValue( frv0test )
todaysTest.getRange(`Q${j6}`).setValue( frv2test )
todaysTest.getRange(`R${j6}`).setValue( frv3test )
}
})
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/434970.html
