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