我怎样才能使用数组来使这段代码更快?

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");

};
  1. 我使用此代码匹配 sheet1 中的文本,并从 sheet2 中获取匹配该文本的一行数据并将数据带回 sheet1.
  2. 运行 花费了很多时间。
  3. 我想让它 运行 更快。有人可以指导我吗?
  4. 我是业余码农

描述

我无法对此进行测试,但基本上我所做的就是将您的 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");

};

参考