【发布时间】:2022-10-04 18:05:35
【问题描述】:
在Column A 中,我有一组数字,格式如下:
K = 千 (10^3)
M = 百万 (10^6)
B = 十亿 (10^9)
...
N = 百万美元 (10^30)
d = 十亿分之一 (10^33)我希望能够找到最大解析值的索引从这个专栏。
我已经在 Apps 脚本中编写了一个自定义函数,以便在需要对它们进行数学运算时将这些值解析为科学记数法:
/** * Parses scientific notation from short notation. * * @pararm {number} input The value to parse. * @return The parsed number in scientific notation. * @customfunction */ function parse(input) { return String(input).replace('K', 'E+3').replace('M', 'E+6').replace('B', 'E+9').replace('T', 'E+12').replace('q', 'E+15').replace('Q', 'E+18').replace('s', 'E+21').replace('S', 'E+24').replace('o', 'E+27').replace('N', 'E+30').replace('d', 'E+33'); }例如:
=parse("10B")将产生10E+9。然后我接受了这个,并尝试创建一个函数来获取最大值的索引:
/** * Discern the maximum value contained in a column, and return its index * * @param {string} column The column letter to check * @param {number} start The first index (row) to check * @param {number} end The last index (row) to check * @customfunction */ function customMax(column, start, end){ var max = 0; var maxIndex = 0; for(var i = start; i<= end;i++){ var value = SpreadsheetApp.getActiveSheet().getRange(column + String(i)).getValue(); var parsedVal = parseInt(parse(value)); if(parsedVal > max){ max = parsedVal; maxIndex = i; } } return maxIndex; }这段代码对我来说很有意义,并且看起来应该可以工作,但是:
A 1 300T 2 1d 对于这样的数据,
1d比300T大得多,但是运行=customMax("A", "1", "2")会产生1。我发现的唯一一致性是,Apps 脚本似乎忽略了
T、d或任何其他后续字符,并且完全偏离了数字的基数。
【问题讨论】:
-
@Tanaike 不需要道歉 - 输入依次是 A1 和 A2,预期输出是索引
2应该是最大的,因为1d相当于1E+33,而300T只是300E+12。 -
使用
Number而不是parseInt -
@idfurw 这似乎解决了 OP 的问题,也许您可以将其发布为好答案关于这个问题。
-
我肯定会接受这个作为答案。尽管我也很欣赏
Number()构造函数为何起作用而parseInt()不起作用的一些见解。 -
@David 你也可以查看这个在线资源:Number() vs parseInt()
标签: google-apps-script google-sheets