【问题标题】:Javascript / Googlescript using set.Formula with complex formulasJavascript / Googlescript 使用 set.Formula 和复杂的公式
【发布时间】:2016-01-09 01:47:18
【问题描述】:

我对此进行了研究,但找不到合适的解决方案。当放置在工作表单元格中时,以下公式在公式级别可以正常工作。问题是我希望公式在脚本级别运行。我知道的选项包括运行脚本以: (1) set.Formula('=复数公式') 或者 (2) 将整个公式重写为脚本

我是 GAS 新手,对这两种方法都搞砸了。使用选项 (1) 时似乎存在语法错误,通常以缺少“)”的形式出现,我无法调试。使用选项 (2) 目前高于我的技能水平。任何一个选项的任何帮助将不胜感激。

这是有问题的公式:

=ARRAYFORMULA(QUERY({UI!A:G,YEAR(UI!A:A),MONTH(UI!A:A), TEXT(UI!A:A, "MMMM"), TEXT(UI! A:A, "MMM-YY"), 替换(UI!A:A,1,1000,"GRAND TOTAL")}, "SELECT * WHERE Col1 IS NOT NULL AND Col2 IS NOT NULL LABEL Col8 '年',Col9 '月MO#',Col10 '月MO',Col11 '月MOYR',Col12 '总计'"))

【问题讨论】:

  • 如果它只需要在较新的浏览器中工作,您可以使用set.Formula(`=complex formula`) 语法(注意重音符号而不是 apos/quote)这样可以避免牙签问题。 en.wikipedia.org/wiki/Leaning_toothpick_syndrome
  • 尝试 set.Formula(=complex formula) 使用 chrome 版本 46.0.2490.80 m。没有运气。脚本编辑器在测试时返回“非法字符”错误。
  • 尝试使用 chrome 版本 46.0.2490.80 m 使用重音符号(由于某种原因我无法让它们出现在我的评论中)的 set.Formula。没有运气。脚本编辑器在测试时返回“非法字符”错误。
  • 您需要将该代码放在坟墓标记的底部。然后,您可以用换行符将其隔开,而不必担心嵌套引号。
  • 我使用了你提到的带有严重标记的代码......代码行甚至不会保存,因为源公式在代码中具有/需要'和',并且似乎想要由“虽然使用无效”分隔,但它也是内部代码的一部分。当我使用坟墓标记时,我仍然得到非法字符错误

标签: multidimensional-array google-apps-script google-sheets formulas array-formulas


【解决方案1】:

回答

公式不会“在脚本级别”运行,因此您必须将公式重写为 Google Apps 脚本/JavaScript 函数。

在脚本中转义公式撇号

如果您希望通过脚本将复杂公式添加到单元格中,请记住,在一行中编写复杂公式会使调试变得更加困难。 尝试将公式除以函数和参数,并使用制表符对齐它们。恕我直言,这可以防止使用 \ 使脚本不可读 (Leaning toothpick syndrome)。

下面是一个 onEdit() 函数,它将问题中的复杂公式插入到写入“是”的单元格右侧的单元格中。查看使用\ 来转义查询函数(select 语句)的第二个参数中使用的撇号。

function onEdit() {
  var ss = SpreadsheetApp.getActive();
  var rng = ss.getActiveRange();
  var trg = rng.offset(0, 1);
  var formula = 
    '=ARRAYFORMULA('
       + 'QUERY({'
            + 'UI!A:G,YEAR(UI!A:A),MONTH(UI!A:A),' 
            + 'TEXT(UI!A:A, "MMMM"), '
            + 'TEXT(UI!A:A, "MMM-YY"), '
            + 'REPLACE(UI!A:A,1,1000,"GRAND TOTAL")'
          + '},' 
          + '"SELECT * WHERE Col1 IS NOT NULL AND Col2 IS NOT NULL LABEL Col8 \'Year\', '
            + 'Col9 \'MonthMO#\', Col10 \'MonthMO\', Col11 \'MonthMOYR\', '
            + 'Col12 \'GRAND TOTAL\'"'
       + ')'
     + ')';
  if(rng.getValue() == 'Yes') trg.setFormula(formula);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2018-04-12
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多