Javascript 谷歌脚本';更换';带量程的函数

Javascript 谷歌脚本';更换';带量程的函数,javascript,arrays,multidimensional-array,google-apps-script,Javascript,Arrays,Multidimensional Array,Google Apps Script,我试图在谷歌电子表格中编写一个“罗马数字到十进制数字”的函数。 到目前为止,我已成功地使用以下代码使其工作: function rom2num(inputRange) { inputRange = inputRange.replace(/\bi\b/gi,1); //convert 'I' to '1' return inputRange; } 当输入仅为一个单元格时,此功能非常有效。然而,每当我尝试输入一个范围(A1:B2)时,我都会得到错误:“在对象中找不到函数替换” 我想要实现的一些

我试图在谷歌电子表格中编写一个“罗马数字到十进制数字”的函数。 到目前为止,我已成功地使用以下代码使其工作:

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
我可以选择在下面的单元格中重复这个函数,正如Crayon所建议的那样,但是,需要重新格式化的范围可能是50行,也可能是100行,如果不使用,我更愿意不添加50个额外的函数实例。我希望它尽可能自动化。:-)

我知道,只需使用以下代码,就可以检索一系列单元格中的信息,并返回另一系列单元格中的信息:

function copyRange(inputRange) {
return inputRange;
}
因此,输入一个范围并输出相同的范围不是问题。问题是试图合并replace函数。我已经使用“toString()”-函数在整个范围内修改了信息。然后,我可以使用“split(“,”)将输出拆分为几列,但我不希望它分散在列中,而只是行中

因此,如果我能以某种方式将范围/数组转换为字符串,然后再转换回范围/数组

是否可以在不过度膨胀代码的情况下实现这一点?(我是一名新手,喜欢短小的脚本,就像上面的例子一样。)

如果我不清楚,我很抱歉。我习惯于在类似这样的论坛上查找答案,但我自己不会问这些问题

谢谢

编辑:终于意识到事情变得有点太复杂了,所以我只是按照蜡笔的建议,使用了“拖动”方法。帮我省了不少麻烦。谢谢你的帮助

根据您的函数,您只能更改调用该函数的单元格中的数据,因此您不应该试图以任何方式更改多个单元格。您应该让函数对该单元格进行替换,然后将该函数应用于多个单元格

比如说

A  B
i  =rom2num(A1)
i
i
i
这将使B1等于“1”。现在将鼠标放在B1上,右下角是点,向下拖动到B4,您将看到应用于B2-4行的函数

编辑:

根据你在问题中的评论和补充信息,我想我知道你想做什么。基本上,您希望利用向单元格溢出的值来有效地作用于多个单元格。是的,通过返回一个双数组,这是可能的。您的新示例显示..这比简单地执行
.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;
}
函数将返回并溢出单元格,如下所示:

A               B
i, ii, iii      1, 11, 111
Godfather II    Godfather 11
iv, v, vi       1v, v, v1
Star Wars V     Star Wars V
就像我说的,你需要做的不仅仅是
。替换
(转到我给你的链接)来将罗马数字转换成数字,但就你的实际问题而言,这应该可以做到

编辑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;
}
函数rom2num(输入范围){
var单元格=[];

对于(var i=0;iSo,如果它不是字符串,那么
inputRange
变量中有什么?请添加类型(如
typeof inputRange
所报告的)和该变量的内容。这根本不是谷歌脚本问题,只是简单的JavaScript,但如果不知道该变量中有什么,则很难提供帮助。:-)嗨!谢谢你的快速回复。我编辑了这篇文章,希望能让情况更清楚,并回答你的问题。谢谢!哇,这太详细了。:-)真的,你把事情弄得太复杂了。让我们重新开始。你有一个函数。它接受输入并转换为输出。那到底是什么输入?什么输出它应该从这些输入中生成吗?为这两个方面都给出具体的例子,尽可能多的例子来展示您可能遇到的不同情况,但不要再多了。忘记电子表格API和其他一切,这只是一个分散注意力的问题。了解这个特定功能的最低具体要求,然后你就有了一些东西ng这很容易解决。当然,我在这里可能过于简单化了!看看Crayon的答案,了解一些有价值的信息。我真正的目的是分离出两个问题:1)如何以您需要的方式与电子表格API交互,以及2)如何编写一个JavaScript函数来完成您需要的转换。如果您可以sepa对这两个问题进行评分可能更容易分析问题。哈哈,谢谢你和我一起讨论并试图解决我的问题。好吧,在谷歌电子表格文档中,我可以打开一个脚本编辑器。在编辑器中,我可以声明一个函数,它看起来与我上面的第一个代码示例完全相同。然后,要在电子表格中调用我的函数,我只需键入(在单元格中)=rom2num(输入)。(输入可以是一些文本或对另一个单元格或另一个单元格区域的引用。您好!感谢您将我指向该页面。它包含一些关于返回数组的信息,这可能是我必须要做的。实际上,我并没有试图更改原始数据,我只想检索数据,然后在另一个单元格中输出该数据的变体。The不想使用“拖动”方法的原因是原始范围内的内容可能会更改,并且包含更多或更少的行。嘿@user2268171谢谢您的评论,也更新了您的问题。我想我理解您现在试图做的事情,并已更新了我的答案以反映它。希望这对您有所帮助!@user2268171我更新了m我很想看看最终的解决方案,所以我继续添加了ro
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;
}