如何在Google工作表的不同标签中获取和设置值?

时间:2018-04-09 08:16:53

标签: javascript google-apps-script google-sheets

我有一张 TAB A TAB B 的表格。

我想循环遍历 TAB A 并获取我想要粘贴在 TAB B 中的值矩阵。

抛出错误,"无法读取属性1等



function getValuesFromModal(form) {
  var IdeasCounter = 0;
  const IDEA = 10,
    PROD = 26,
    PROM = 20,
    CLIENT = 4,
    ORANGE = "#e69138",
    GREEN = "#6aa84f",
    RED = "#e06666";
  var rangeSource = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Records").getRange("A2:V").getValues();
  var rangeDest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Board").getRange("A2:E");


  for (i in rangeSource) {
    if (rangeSource[i][0] == "Ideas" && (!isNaN(parseInt(rangeSource[i][17])))) {
      rangeDest[IdeasCounter][0].setValue("( " + rangeSource[i][2] + " )" + "\n" + rangeSource[i][3] + "\n\n" + "[ " + rangeSource[i][17] + " ]");
      switch (rangeSource[i][17]) {
        case rangeSource[i][17] < (IDEA - 2):
          rangeDest[IdeasCounter][0].setBackground(GREEN);
          break;
        case rangeSource[i][17] > (IDEA):
          rangeDest[IdeasCounter][0].setBackground(RED);
          break;
        case rangeSource[i][17] < (IDEA):
          rangeDest[IdeasCounter][0].setBackground(ORANGE);
          break;
      }
      IdeasCounter++;
    }

  }

}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

我发现您的脚本存在一些问题,并相应地对其进行了修改:

  • 我在提取值时重新命名for..in,而不是实际范围。
  • 然后,我为目标值和单元格背景创建了新数组。这是必要的,以便在运行脚本时,不会覆盖以前存在的值和背景颜色。此外,迭代范围值的数组是 much faster ,而不是遍历范围。

  • 您使用的是Range循环,但您不应该在此处执行此操作。相反,使用顺序for循环。请查看this great answer以了解原因。 (另外,您无法使用数组[][]表示法遍历Google sourceValues[i][17]类。您必须在范围内使用非常慢的getCell()方法,但它是 vveeerrryyy ssssllooowwww 。)

  • 我将sourceValues[i][*]保存到自己的变量中,但理想情况下,您应该为其他switch值执行此操作,因为它更易于阅读和维护。

    < / LI>
  • <语句不正确,因为它并不真正意味着处理> / function getValuesFromModal(form) { var IdeasCounter = 0; const IDEA = 10, PROD = 26, PROM = 20, CLIENT = 4, ORANGE = "#e69138", GREEN = "#6aa84f", RED = "#e06666"; var sourceValues = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Records").getRange("A2:V").getValues(); var destRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Board").getRange("A2:A"); // Looked like you were only writing to column A var destNewValues = destRange.getValues(); var destBackgrounds = destRange.getBackgrounds(); for (var i=0; i<sourceValues.length; i++) { var ideaValue = sourceValues[i][17]; if (sourceValues[i][0] == "Ideas" && (!isNaN(parseInt(ideaValue)))) { var destValue = "( " + sourceValues[i][2] + " )\n" + sourceValues[i][3] + "\n\n[ " + ideaValue + " ]"; destNewValues[i][0] = destValue; if (ideaValue < (IDEA - 2)) { // Right now excluding ideaValue == 10 destBackgrounds[i] = [GREEN]; } else if (ideaValue > IDEA) { destBackgrounds[i] = [RED]; } else if (ideaValue < IDEA) { destBackgrounds[i] = [ORANGE]; } } } destRange.setValues(destNewValues).setBackgrounds(destBackgrounds); } 比较。再一次,别人对你如何做到这一点的解释,以及为什么你不应该做到这一点比我的好;你可以阅读here

  • 然后我使用了batch operations,因为它们更快,write the destination valueset the cell background colors

修改后,结果如下:

ng test