Google Script '带范围的函数
Google Script 'replace' function with range
我试图在谷歌电子表格中编写一个"罗马数字到小数"函数。到目前为止,我已经设法使用下面的代码使其工作:
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;
}
所以输入一个范围并输出相同的范围不是问题。问题是如何结合替换函数。我已经设法改变信息在整个范围内使用'toString()'-函数。然后,我可以使用'split(",")'将输出拆分为几列,但我不希望它跨列分布,只是行。
所以如果我可以将范围/数组转换为字符串,然后再转换回范围/数组…
是否有可能实现这一点,而不使代码过于臃肿?(我是一个新手,我喜欢我的脚本短,就像我上面的例子。)
如果我没说清楚,我很抱歉。我习惯在这样的论坛上查找答案,但不问自己的问题!谢谢!
编辑:最后意识到事情变得有点太复杂了,所以我只是使用了蜡笔的建议,并使用了'拖拽'方法。省了我不少麻烦。谢谢你的帮助!!
根据https://developers.google.com/apps-script/execution_custom_functions,您的函数只能更改调用该函数的单元格中的数据,因此您不应该尝试更改多个单元格。您应该让函数对该单元格进行替换,然后将该函数应用于多个单元格。
例如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;
}
这里的示例遍历范围中的每一行,并简单地将"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
(去我给你的链接)来实际将罗马数字转换为数字,但就你的实际问题而言,这应该可以做到。
编辑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列单元格对齐。但是记住,它实际上并没有改变单个的An> Bn细胞。它实际上是抓取您指定的范围并将结果溢出到多个单元格中。它有效地做了你想做的事情,但并不是完全相同的事情。
我使用了一个更简洁的方法:
const ss = SpreadsheetApp.getActiveSpreadsheet()
const sh = ss.getSheetByName('Sheet1')
sh
.getRange('A:B')
.createTextFinder('i')
.replaceAllWith('1')
- 正在全局范围中查找JavaScript函数
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 可以't访问JavaScript函数范围中的变量
- 在 Angular 指令中,如何进行回调,其中函数名称位于父范围的变量中
- 我怎样才能创建一个函数expr;t继承词法范围
- 获取给定JavaScript范围内的解析函数
- 为什么在javascript中的模块模式中实现Lazy函数时范围会发生变化
- 如何在JavaScript中使用此函数对范围内的所有数字求和
- 构造函数函数中的自执行函数的OO上下文/范围
- javascript和jQuery的嵌套对象函数中的变量范围
- 对象内部函数内的对象文本的范围
- JavaScript 函数变量范围问题
- 如何触发指令中定义的范围函数
- 范围函数角度的右设置
- 角度控制器范围项作为范围函数的子项
- 在 Angular 指令中的事件处理程序中调用范围函数
- Angular JS 如何从指令模板内容事件调用指令范围函数
- 如何使用混合参数调用父级的范围函数
- 如何从带有参数的指令中调用角度控制器范围函数
- 为什么我的范围函数显示一个未定义的值后,循环应该已经关闭