在范围上应用If / Then(google-apps-script)

时间:2013-04-16 16:15:53

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

我正在慢慢地努力了解如何制定一个共同的编程过程,但我需要一个愿意进一步教我如何捕鱼的人(在这个JS池塘里)。

我想测试一系列单元格(例如:A1:A10),如果在该范围内的单元格中找到“,”,我想在单元格右侧5列中编写一个公式细胞

到目前为止,我已经能够在指定特定单元格时使其工作,但我不知道如何采用它来处理一系列单元格。

(顺便说一句,这是我理解如何在VBA中做的事情 - 尽管没有SPLIT功能 - 但这种语言显然是一种非常不同的动物)

以下是我现在所拥有的:

var defSheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1")   
var test1 = defSheet1.getRange("A1").getValue();
var splitCell = '=SPLIT(A1,",")';
if (test1.indexOf(",") !== -1)  
{
defSheet1.getRange("F1").setFormula(splitCell);
}
 else 
  { 
Browser.msgBox("NO SPLIT NECESSARY");   
  } 

(顺便说一句,实际范围将通过使用getDataRange来确定,但为了简单起见,我在这里使用预先建立的范围)

我已经在这里学到了很多东西,而且我逐渐获得了在JS中“思考”的能力,但是VBA“ For x = 1 to numLastRow ”的概念并非如此在JS点击给我。

1 个答案:

答案 0 :(得分:0)

当您处理电子表格中的多行和/或列时,一个挑战是在索引之间进行转换以及可以表达单元格位置的各种方式。

  • 在A1Notation中,列首先表示为字母,后跟行,表示从1开始的数字。
  • R1C1表示法翻转行和列的顺序,两个维度都是从1开始的数字。
  • javascript中的数组从索引0开始。当您将脚本发展为使用getDataRange().getValues()时,这一点很重要。在getValues()返回的二维数组中,行首先表示,然后是列,如data[row][column]中所示。您需要相应地调整循环的上限,如果您引用了+1之类的Range方法,则可能需要setFormula()

下面的代码片段将完成您所需要的操作,作为起点。我遗漏了else块以减少噪音。请注意使用getA1Notation()动态构建SPLIT公式 - 直接演变您的脚本。

您需要自己定义numLastRow,并且由于脚本始终访问Range方法,10将表示单元格A10

var defSheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1")

for (var x=1; x<=numLastRow; x++) {
  var srcRange = defSheet1.getRange(x,1);
  var value = srcRange.getValue();  // Get value at Row x, Column 1
  if (value.indexOf(",") !== -1) {
    var splitCell = '=SPLIT(' + srcRange.getA1Notation() + ',",")';
    defSheet1.getRange(x,5).setFormula(splitCell);
  }
};