谷歌脚本“代替”与范围功能(Google Script 'replace' func

2019-10-17 23:57发布

我想脚本在谷歌电子表格是“罗马数到十进制数”功能。 到目前为止,我设法使它工作使用下面的代码:

function rom2num(inputRange) {
inputRange = inputRange.replace(/\bi\b/gi,1); //convert 'I' to '1'
  return inputRange;
}

这工作完全当输入只有一个细胞。 但是,每当我试着输入范围(A1:B2)我得到的错误:“找不到函数对象替换”。

什么我想要实现的一些例子:

Column A      | Column with function
i, ii, iii    | 1, 2, 3
Godfather II  | Godfather 2
iv, v, vi     | 4, 5, 6
Star Wars V   | Star Wars 5

我可以选择重复下面的细胞功能,如蜡笔建议,不过,需要重新格式化可能是50行的范围内,也可能是100行,我不喜欢的功能,如果50个多实例抛他们没有被使用。 我希望它尽可能自动。 :-)

我知道这是可以检索单元格区域的信息,并返回在细胞中的另一范围的信息只是通过使用下面的代码:

function copyRange(inputRange) {
return inputRange;
}

因此,要输入范围和输出相同的范围内是没有问题的。 问题是试图将替换功能。 我已成功地改变了整个范围内使用“的toString()”的信息 - 的功能。 然后,我能够向输出过使用“分裂(‘’),”几列分裂,但我不希望它跨列,只有一排排传播。

所以,如果我以某种方式可以在范围/数组转换成字符串,然后返回一个范围/阵列...

是否有可能实现这一目标没有腹胀的代码太多了? (我是一个新手编剧和喜欢我的剧本很短,就像我上面的例子)。

我很抱歉,如果我是不清楚。 我已经习惯了查找在这样的论坛上答案,但没有问问题喽!

谢谢!

编辑:终于意识到事情变得有点太复杂,所以我刚去用蜡笔建议和使用的“dragging'法。 救了我很多hazzle的。 谢谢您的帮助!!

Answer 1:

根据https://developers.google.com/apps-script/execution_custom_functions您的功能只能在函数被调用的细胞改变的数据,所以你不应该试图改变反正多个单元格。 你应该具备的功能都替换为单元格,然后应用功能到多个单元格。

例如

A  B
i  =rom2num(A1)
i
i
i

这将使B1等于“1”。 现在,将鼠标放在B1和右下方是点点,向下拖动至B4,你会看到应用于行B2-4功能。

编辑:

在您的评论和其他信息在你的问题来看,我想我知道你想要做什么。 基本上你想利用溢出价值的细胞在多个小区上采取有效行动。 所以,是的,这是可能通过返回的double数组。 你的新的例子显示了转换罗马数字实际数字 ..well这是一个有点复杂得多,简单地做一个.replace ,但你应该能够找出如何工作的东西变成你想要做的,一旦你弄清楚什么如何获得价值上下工夫! 因此,这里是如何做到这一点:

function rom2num(inputRange) {
  var cells = [];
  for (var i=0;i<inputRange.length;i++) {
    cells[i] = [String(inputRange[i]).replace(/i/gi,1)];
  }
  return cells;
}

本实施例中通过在范围内的每个行这里进行迭代,并且简单地取代的“i”与“1”。 然后,它返回值的双阵列,所以例如,如果您有

A              B
i, ii, iii     =rom2num(A1:A4)
Godfather II
iv, v, vi
Star Wars V

该函数将返回和溢出细胞是这样的:

A               B
i, ii, iii      1, 11, 111
Godfather II    Godfather 11
iv, v, vi       1v, v, v1
Star Wars V     Star Wars V

就像我说的,你所要做的不仅仅是.replace (去我给你的链接)实际上是罗马数字转换为numberals,但至于你的实际问题,这应该这样做。

编辑2:

其实我去进取,结合罗马数字转换功能进去,因为我想看看它。 所以我想可能跟你的最终脚本,以及分享:

function rom2num(inputRange) {
  var cells = [];
  for (var i=0;i<inputRange.length;i++) {
    cells[i] = [
      String(inputRange[i]).replace(/\b([ivxcldm]+)\b/gi,function(p,p1) {
        return deromanize(p1); 
      })
    ];
  }
  return cells;
}

function deromanize (str) {
    var str = str.toUpperCase(),
        validator = /^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/,
        token = /[MDLV]|C[MD]?|X[CL]?|I[XV]?/g,
        key = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1},
        num = 0, m;
    if (!(str && validator.test(str)))
        return false;
    while (m = token.exec(str))
        num += key[m[0]];
    return num;
}

像以前同样的事情... A列有要作用于的东西,把你=rom2num(A1:A4)在列B这将使转换罗马数字为B列的每个单元格的第一个单元格,一字排开列A的细胞。 但请记住,这不是真正改变个人的> BN cells..it真的抓住你指定的范围和溢出的结果成多个单元。 它有效地你想要做什么,但它并不完全是一回事。



文章来源: Google Script 'replace' function with range