首页 文章

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

提问于
浏览
1

我正在慢慢地努力了解如何制定一个共同的编程过程,但我需要一个愿意进一步教我如何钓鱼的人(在这个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来确定,但为了简单起见,我在这里使用预先 Build 的范围)

我逐渐获得了JS中"think"的能力,但是VBA“For x = 1 to numLastRow”概念并没有在JS中点击我 .

1 回答

  • 0

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

    • 在A1Notation中,列首先表示为字母,后跟行,表示从1开始的数字 .

    • R1C1表示法翻转行和列的顺序,两个维度都是从1开始的数字 .

    • javascript中的数组从索引0开始 . 当您将脚本发展为使用 getDataRange().getValues() 时,这将非常重要 . 在 getValues() 返回的二维数组中,行首先表示,然后是列,如 data[row][column] . 你需要相应地调整循环的上限,如果你引用像 setFormula() 这样的Range方法,你可能需要 +1 .

    下面的代码片段将执行're looking for, as a starting point. I'块中的 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);
      }
    };
    

相关问题