我怎样才能使用数组来使这段代码更快?
How can I use arrays to make this code faster?
当我点击“Add Item”时,我希望代码为 运行 并在表格下方的 table 中显示信息。
function AddItem() {
//DEFINE ALL ACTIVE SHEETS`
var ss = SpreadsheetApp.getActiveSpreadsheet();
//DEFINE MENU SHEET `
var poSheet = ss.getSheetByName("POF");
var itemSheet = ss.getSheetByName("Products");
`//GET NEXT ROW OF PO SHEET`
var lastrowPO = poSheet.getLastRow() + 1;
`//GET LAST ROW OF ITEM SHEET`
var lastrowItem = itemSheet.getLastRow();
`// GET VALUE OF PART AND QUANTITY`
var part = poSheet.getRange('B15').getValue();
var quantity = poSheet.getRange('B17').getValue();
` // GET UNIT PRICE FROM ITEM SHEET`
for (var i = 2; i <= lastrowItem; i++) {
if (part == itemSheet.getRange(i, 3).getValue()) {
var part = itemSheet.getRange(i, 3).getValue();
var unitCost = itemSheet.getRange(i, 5).getValue();
var prodcode = itemSheet.getRange(i, 2).getValue();
} else if (part == itemSheet.getRange(i, 2).getValue()) {
var part = itemSheet.getRange(i, 3).getValue();
var unitCost = itemSheet.getRange(i, 5).getValue();
var prodcode = itemSheet.getRange(i, 2).getValue();
}
};
// POPULATE PO SHEET
poSheet.getRange(lastrowPO, 1).setValue(prodcode);
poSheet.getRange(lastrowPO, 2).setValue(part);
poSheet.getRange(lastrowPO, 3).setValue(quantity);
poSheet.getRange(lastrowPO, 4).setValue(unitCost).setNumberFormat("#,###.00");
};
- 我使用此代码匹配 sheet1 中的文本,并从 sheet2 中获取匹配该文本的一行数据并将数据带回 sheet1.
- 运行 花费了很多时间。
- 我想让它 运行 更快。有人可以指导我吗?
- 我是业余码农
描述
我无法对此进行测试,但基本上我所做的就是将您的 getValue/setValue 更改为 getValues/setValues。这通常会显着提高性能。
你的逻辑的某些部分我不太明白,但试图按原样复制你的逻辑。例如,您在 else 块中将 prodcode
更改为 part
。而不是在找到匹配项后继续循环,我 break
退出了循环。
使用items
数组 电子表格的第1行是数组的第一个索引0。同样,电子表格的第 1 列是数组的第二个索引 0。
Code.gs
function AddItem() {
//DEFINE ALL ACTIVE SHEETS`
var ss = SpreadsheetApp.getActiveSpreadsheet();
//DEFINE MENU SHEET `
var poSheet = ss.getSheetByName("POF");
var itemSheet = ss.getSheetByName("Products");
//GET NEXT ROW OF PO SHEET`
var lastrowPO = poSheet.getLastRow() + 1;
//GET LAST ROW OF ITEM SHEET`
var lastrowItem = itemSheet.getLastRow();
// GET VALUE OF PART AND QUANTITY`
var part = poSheet.getRange('B15').getValue();
var quantity = poSheet.getRange('B17').getValue();
// Use getValues to get all data
var items = itemSheet.getDataRange().getValues();
// GET UNIT PRICE FROM ITEM SHEET
// Here I'm assuming you want from row 2 to the last row
// And I'm assuming you want the first occurance of part
for( var i = 1; i < items.length; i++ ) {
if( part == items[i][2] ) {
var unitCost = items[i][4];
var prodcode = items[i][1];
break;
}
else if( part == items[i][1] ) {
var prodcode = part;
part = items[i][2];
var unitCost = items[i][4];
break;
}
};
// POPULATE PO SHEET
// To use setValues it must pass a 2D array of 1 row
poSheet.getRange(lastrowPO,1,1,4).setValues([[prodcode,part,quantity,unitCost]]);
poSheet.getRange(lastrowPO, 4).setNumberFormat("#,###.00");
};
参考
当我点击“Add Item”时,我希望代码为 运行 并在表格下方的 table 中显示信息。
function AddItem() {
//DEFINE ALL ACTIVE SHEETS`
var ss = SpreadsheetApp.getActiveSpreadsheet();
//DEFINE MENU SHEET `
var poSheet = ss.getSheetByName("POF");
var itemSheet = ss.getSheetByName("Products");
`//GET NEXT ROW OF PO SHEET`
var lastrowPO = poSheet.getLastRow() + 1;
`//GET LAST ROW OF ITEM SHEET`
var lastrowItem = itemSheet.getLastRow();
`// GET VALUE OF PART AND QUANTITY`
var part = poSheet.getRange('B15').getValue();
var quantity = poSheet.getRange('B17').getValue();
` // GET UNIT PRICE FROM ITEM SHEET`
for (var i = 2; i <= lastrowItem; i++) {
if (part == itemSheet.getRange(i, 3).getValue()) {
var part = itemSheet.getRange(i, 3).getValue();
var unitCost = itemSheet.getRange(i, 5).getValue();
var prodcode = itemSheet.getRange(i, 2).getValue();
} else if (part == itemSheet.getRange(i, 2).getValue()) {
var part = itemSheet.getRange(i, 3).getValue();
var unitCost = itemSheet.getRange(i, 5).getValue();
var prodcode = itemSheet.getRange(i, 2).getValue();
}
};
// POPULATE PO SHEET
poSheet.getRange(lastrowPO, 1).setValue(prodcode);
poSheet.getRange(lastrowPO, 2).setValue(part);
poSheet.getRange(lastrowPO, 3).setValue(quantity);
poSheet.getRange(lastrowPO, 4).setValue(unitCost).setNumberFormat("#,###.00");
};
- 我使用此代码匹配 sheet1 中的文本,并从 sheet2 中获取匹配该文本的一行数据并将数据带回 sheet1.
- 运行 花费了很多时间。
- 我想让它 运行 更快。有人可以指导我吗?
- 我是业余码农
描述
我无法对此进行测试,但基本上我所做的就是将您的 getValue/setValue 更改为 getValues/setValues。这通常会显着提高性能。
你的逻辑的某些部分我不太明白,但试图按原样复制你的逻辑。例如,您在 else 块中将 prodcode
更改为 part
。而不是在找到匹配项后继续循环,我 break
退出了循环。
使用items
数组 电子表格的第1行是数组的第一个索引0。同样,电子表格的第 1 列是数组的第二个索引 0。
Code.gs
function AddItem() {
//DEFINE ALL ACTIVE SHEETS`
var ss = SpreadsheetApp.getActiveSpreadsheet();
//DEFINE MENU SHEET `
var poSheet = ss.getSheetByName("POF");
var itemSheet = ss.getSheetByName("Products");
//GET NEXT ROW OF PO SHEET`
var lastrowPO = poSheet.getLastRow() + 1;
//GET LAST ROW OF ITEM SHEET`
var lastrowItem = itemSheet.getLastRow();
// GET VALUE OF PART AND QUANTITY`
var part = poSheet.getRange('B15').getValue();
var quantity = poSheet.getRange('B17').getValue();
// Use getValues to get all data
var items = itemSheet.getDataRange().getValues();
// GET UNIT PRICE FROM ITEM SHEET
// Here I'm assuming you want from row 2 to the last row
// And I'm assuming you want the first occurance of part
for( var i = 1; i < items.length; i++ ) {
if( part == items[i][2] ) {
var unitCost = items[i][4];
var prodcode = items[i][1];
break;
}
else if( part == items[i][1] ) {
var prodcode = part;
part = items[i][2];
var unitCost = items[i][4];
break;
}
};
// POPULATE PO SHEET
// To use setValues it must pass a 2D array of 1 row
poSheet.getRange(lastrowPO,1,1,4).setValues([[prodcode,part,quantity,unitCost]]);
poSheet.getRange(lastrowPO, 4).setNumberFormat("#,###.00");
};
参考