所以我在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
答案 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”返回准确的值。
还有一些其他注意事项:
getValue
调用;这些都是费时的。答案通过在循环之前获取一次相应的范围值来提高性能。setValue(TOT)
)的更新在循环内。同样,这是一个耗时的命令。答案将更新循环中的数组值,然后仅在循环后更新工作表一次。 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);
}