所以我有以下代码,完全符合我们的目的,我花了很长时间才把它放在一起,而且我知道这对我的问题来说是一个非常低效的解决方案。为了空间的利益,我只链接了第一个if语句。这与其他结果重复14次。
问题在于我们很快就会有100多个项目,虽然这个项目可以用于5个项目,但是我担心它会有太多的工作而且运行得非常慢,无法复制。
function onEdit(event) {
var invinput = ss.getRange("L16").getValue();
var iteminput = ss.getRange("J16").getValue();
var item1 = ss.getRange("A2").getValue();
var item2 = ss.getRange("A3").getValue();
var item3 = ss.getRange("A4").getValue();
var item4 = ss.getRange("A5").getValue();
var item5 = ss.getRange("A6").getValue();
var inv1 = ss.getRange("B2").getValue();
var inv2 = ss.getRange("B3").getValue();
var inv3 = ss.getRange("B4").getValue();
var inv4 = ss.getRange("B5").getValue();
var inv5 = ss.getRange("B6").getValue();
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("invinputlog");
var itemList = ss.getRange(1,0,1000)
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
if(s.getName() == "IMI" && r.getColumn() == 14 && r.getValue() == "add" && (iteminput == item1)) {
ss.getRange("B2").setValue(invinput+inv1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
ss.getRange("restockInput").clear();}
我发现了很多有用的解决方案,有些"对于"我测试过的陈述,但我无法弄明白。
我的问题是,而不是必须比较" item1 == itemInput"对于我们拥有的每件商品,我希望它类似于
if iteminput == (anything in column A) {
ss.getRange("Cell B next to Cell A that matches iteminput").setValue
(invinput+"cell B that is next to cell A that matches iteminput");}
如果有人有任何想法,请提前感谢,我真的很喜欢这些项目,所以即使让我走上正轨也会很棒。我很高兴自己弄清楚,我只是有点卡住了。
答案 0 :(得分:0)
如果你要拥有100件物品,那么就像你说的那样,它会很慢。什么是缓慢的访问电子表格本身(最快的是内存操纵其他所有'命令',它不访问电子表格)。因此,例如,如果您编写脚本来执行ss.getRange(“A3”)。getValue()一百次,那么这将会很慢。
如果我要解决您的脚本问题,我会使用类似var values = sheet.getDataRange().getValues();
这将创建一个性质
的二维数组[
[A1, B1, C1, ... L1 ],
[A2, B2, C2, ... L2 ],
...
...
[A100, B100, C100, ... L100]
]
你有'外部'数组,它包含多个'内部'数组,每个数组代表一行表,从第一行到最后一行,其中有任何包含数据的单元格和第一行的宽度†列到最后一列,任何包含数据的单元格(中间的每个空白单元格也将在数组中,将由空字符串''
表示)
†.getDataRange()定义范围,从第一个到最后一个数据,如上所述。您也可以使用其他范围定义,例如getRange(“A1:L100”);尽管如此,这个范围的2D性质,以及.getValues()仍将存在。
然后你将不得不在谷歌应用程序脚本中操纵这个2D数组。您可以谷歌搜索for loop in javascript OR google apps script向您显示代码,如下所示:
for (var i = 0; i<values.length; i ++){
// YOUR CODE to manipulate this for..loop
}
此for..loop中的i变量通过您的代码递增每个循环;因此它是每行的模拟(除了它从零开始,即比从1开始的行少一个)。因此,您将使用i引用值中的每一行。作为第二个维度,你将拥有0作为ColA,1作为ColB等,11作为ColL
例如在第四个循环中,我将是3,因此values[i][1]
将引用单元格B4
通过这种方式,在for..loop中使用一行或几行代码,使用i,您可以比较100(或更多)行。
您可以在for..loop中进行if
比较,作为您的代码的一部分。
当if比较找到匹配项时,您应该使用break语句停止循环运行。这将修复var i,然后您可以在for..loop下面的更多脚本中使用它来回写电子表格。为此,我会考虑使用google apps script range.offset
(注意:您的实际用例可能比我上面指出的更复杂,特别是在您需要编写以实现所需比较的代码中(循环中的if
)。但是,您的解决方案几乎肯定需要对电子表格进行getValues()调用,以便不进行100次getValue()调用,因此您将不得不使用2D数组。)