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

Apply If/Then on a Range (google-apps-script)

本文关键字:If 一个 范围 google-apps-script Then 应用      更新时间:2023-09-26

我正在慢慢地努力理解如何制定一个共同的编程过程,但我需要有人愿意进一步教我如何钓鱼(在这个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中没有为我点击。

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

  • 在A1Notation中,列首先表示为字母,然后是行,以1开头的数字表示。
  • R1C1符号颠倒了行和列的顺序,两个维度都是从1开始的数字。
  • javascript中的数组从索引0开始。当您将脚本发展为使用getDataRange().getValues()时,这一点非常重要。在由getValues()返回的二维数组中,先表示行,然后表示列,如data[row][column]。循环的上界需要相应地调整,如果您引用setFormula()等范围方法,则可能需要+1

下面的代码片段将做您正在寻找的,作为一个起点。我省略了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);
  }
};