Google App脚本 - 根据col A检查单元格的值,然后编辑相应的col B

时间:2018-05-18 03:22:37

标签: google-apps-script

所以我有以下代码,完全符合我们的目的,我花了很长时间才把它放在一起,而且我知道这对我的问题来说是一个非常低效的解决方案。为了空间的利益,我只链接了第一个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");}

如果有人有任何想法,请提前感谢,我真的很喜欢这些项目,所以即使让我走上正轨也会很棒。我很高兴自己弄清楚,我只是有点卡住了。

1 个答案:

答案 0 :(得分:0)

如果你要拥有100件物品,那么就像你说的那样,它会很慢。什么是缓慢的访问电子表格本身(最快的是内存操纵其他所有'命令',它不访问电子表格)。因此,例如,如果您编写脚本来执行ss.getRange(“A3”)。getValue()一百次,那么这将会很慢。

如果我要解决您的脚本问题,我会使用类似var values = sheet.getDataRange().getValues();

之类的内容获取电子表格中的所有值(当然是每个onEdit)

这将创建一个性质

的二维数组
[
 [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数组。)