遍历行,获取值并在另一张纸上求和

时间:2019-05-07 07:24:47

标签: google-apps-script google-sheets

所以我在Google表格中对此感到困惑。

“价格计算器”表的数量在A列中买卖了一个商品,分为2个命名范围TRADE_QTY和BUY_QTY。

一个相同的列表出现在“ Master Tally”工作表中,其中以前交易的数量也出现在A列中。

已经浏览了多个示例代码窗口,似乎没有一个能够提供任何有效的方法。

function TEST() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();

 //Gets number of rows of each range
 var Rows1 = ss.getRange('\'PRICE CALCULATOR\'!TRADE_QTY').getNumRows()
 var Rows2 = ss.getRange('\'PRICE CALCULATOR\'!BUY_QTY').getNumRows()
 //Gets Starting rows of each range
 var Row1 = ss.getRange('\'PRICE CALCULATOR\'!TRADE_QTY').getRow()
 var Row2 = ss.getRange('\'PRICE CALCULATOR\'!BUY_QTY').getRow()

    for (r=Row1; r<Rows1; r++) {
    ss.setActiveSheet(ss.getSheetByName('PRICE CALCULATOR'), true);
    var ADD = ss.getRange(r,1).getValue()
    if (cell.isBlank()) {
      next r
    }
    else {
    ss.setActiveSheet(ss.getSheetByName('Master Tally'), true);
    var EXIST = ss.getRange(r,1).getValue()
    var TOT = ADD+EXIST
    ss.getRange(r,1).setValue(TOT)
    }
  }
}

基本上,我尝试开发一个宏/脚本,以将“价格计算器”表中的新交易数量添加到“主理货”中的现有数量中。

我很沮丧,因为它一直在向我扔'找不到方法getRange(number,number)',现在我已经不在我的视野范围内了!

链接到文档; https://docs.google.com/spreadsheets/d/1gIjCqv5KT41wYuJS1Hs1X8yPPUTPY_kGoTuilzxLkSo/edit?usp=sharing

1 个答案:

答案 0 :(得分:0)

此代码有一个基本缺陷:数组的行号和列号(从0到零开始)与从脚本命令(例如getValue(从1到1开始)派生的那些混淆。

例如:

  • for (r=Row1; r<Rows1; r++) {
    在这种情况下,Row1的值由getRow确定,因此它返回实际的行号。但是循环值将生成从零开始的数组的行号和列号。因此此行应显示为for (r=0; r<Rows1; r++) {

  • var EXIST = ss.getRange(r,1).getValue()
    该行的目的是返回“'Master Tally'中的现有数量”,该范围将在A列中查找该值。但是这些值实际上在B列中。因此,此行将永远不会为“ existing qtys”返回准确的值。

还有一些其他注意事项:

  1. 现有代码在每个循环中进行两次getValue调用;这些都是费时的。答案通过在循环之前获取一次相应的范围值来提高性能。
  2. 已售数量(setValue(TOT))的更新在循环内。同样,这是一个耗时的命令。答案将更新循环中的数组值,然后仅在循环后更新工作表一次。
  3. BUY Qty的值不相关

function so56017521() {

  var ss = SpreadsheetApp.getActive();

  //Gets number of rows of each range
  var Rows1 = ss.getRange('\'PRICE CALCULATOR\'!TRADE_QTY').getNumRows()
  //Logger.log("DEBUG: Number of Rows: Trade Qty="+Rows1);

  //Gets Starting rows of each range
  var Row1 = ss.getRange('\'PRICE CALCULATOR\'!TRADE_QTY').getRow()
  //Logger.log("DEBUG: Start Row: Trade Qty="+Row1);

  // setup sheets
  var calcsheet = "PRICE CALCULATOR";
  var mastersheet = "Master Tally";
  var calc = ss.getSheetByName(calcsheet);
  var master = ss.getSheetByName(mastersheet);
  var masterrows = master.getLastRow();
  //Logger.log("DEBUG: Master Last Row = "+masterrows);

  // get data for each sheet
  var calcrange = calc.getRange(Row1, 1, Rows1);
  var calcdata = calcrange.getValues();
  var masterrange = master.getRange(3, 2, masterrows - 2);
  var masterdata = masterrange.getValues();
  //Logger.log("DEBUG: Calc data range = "+calcrange.getA1Notation()+", Master Data Range"+masterrange.getA1Notation());

  for (r = 0; r < Rows1; r++) {
    Logger.log("r=" + r);
    var ADD = calcdata[r][0]; //Trade qty
    //Logger.log("DEBUG: r="+r+", ADD value = "+ADD+", ADD.length = "+ADD.toString().length);

    if (ADD.toString().length != 0) { // if Trade qty has value
      // keep going
      //Logger.log("DEBUG: keep going");
      var EXIST = masterdata[r][0]; // existing quantity qty sold
      Logger.log("DEBUG: r=" + r + ", EXIST = " + EXIST);
      var TOT = ADD + EXIST; // sum of trade-in qty plus existing qty
      Logger.log("DEBUG: ADD+EXIST = " + TOT);

      // update masterdata array
      masterdata[r][0] = TOT;
    } else {
      // nothing to see here
      //Logger.log("DEBUG: next r please");
    }
  }
  //update the spreadsheet with the adjusted array values
  masterrange.setValues(masterdata);
}