我想脚本在谷歌电子表格是“罗马数到十进制数”功能。 到目前为止,我设法使它工作使用下面的代码:
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的。 谢谢您的帮助!!
根据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真的抓住你指定的范围和溢出的结果成多个单元。 它有效地你想要做什么,但它并不完全是一回事。