【问题标题】:Apply If/Then on a Range (google-apps-script)在范围上应用 If/Then (google-apps-script)
【发布时间】:2013-04-09 03:41:33
【问题描述】:

我正在慢慢地了解如何制定一个通用的编程过程,但我需要一个愿意进一步教我如何钓鱼的人(在这个 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 中为我​​点击。

【问题讨论】:

  • 您可以使用以下电子表格公式放入单元格 F1:=arrayformula(iferror(split(A:A, ",")))
  • @David Tew - 非常有趣的选择。我不会想到把它朝那个方向发展。这个概念是守门员。谢谢!

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


【解决方案1】:

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

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

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

【讨论】:

  • 嗯......这绝对是我可以咬牙切齿的东西!但是,如果您没有提供非常感谢的解释,我很确定我的眼睛会呆滞一段时间。非常感谢课程(尤其是)和代码(当然)。我现在将玩弄这个,看看有多少种方法可以修改它来做我需要它做的事情。非常感谢!
  • 顺便说一句,在第 6 行,在最后一个打开的单引号之后(在最后一个双引号之前)缺少逗号。该行应为: var splitCell = '=SPLIT(' + srcRange.getA1Notation() + ',",")';我只为可能来到这里并获取代码供自己使用的其他人指出这一点。
  • 只是好奇,为什么 x "
  • 哇,CodeAcademy 看起来很有希望。现在我只需要找到一个网站链接,我可以在其中获得“一天中的免费额外时间”! :P 感谢您的所有帮助 Mosgdad。我仍然没有在这里获得足够的“代表”来充分地在这个特定领域给予适当的感谢,但您可以确定我对您的时间和帮助的感谢已经远远超出了 SO 的范围。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-17
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多