Google apps script 在谷歌表格中用罗马数字替换所有数字

Google apps script 在谷歌表格中用罗马数字替换所有数字,google-apps-script,google-sheets,Google Apps Script,Google Sheets,技能水平:无搜索,因为我去尝试和找出它 我目前有一个谷歌表单,我正在尝试将所有数字(1,2,3…)自动转换为罗马数字(I,II,III等) 在录制小宏并将它们粘贴在一起进行测试之后,我确实有一个非常长的工作要做。请参见下面的示例:spreadsheet.getRangeList(['E1:E2']).setFormula('=IFERROR(ROMAN(D1;0);“”)) 这将设置带有数字的单元格旁边的罗马值。Google sheets在向下移动单元格时会自动更新,这样就可以了。。 然后我将其

技能水平:无搜索,因为我去尝试和找出它

我目前有一个谷歌表单,我正在尝试将所有数字(1,2,3…)自动转换为罗马数字(I,II,III等)

在录制小宏并将它们粘贴在一起进行测试之后,我确实有一个非常长的工作要做。请参见下面的示例:
spreadsheet.getRangeList(['E1:E2']).setFormula('=IFERROR(ROMAN(D1;0);“”))
这将设置带有数字的单元格旁边的罗马值。Google sheets在向下移动单元格时会自动更新,这样就可以了。。
然后我将其剪切并粘贴到原始单元格中的值。
对包含数字的纸张上的每个区域重复冲洗

这让我感觉非常笨拙,一定是一种更好的方式。通过删除剪切/粘贴部分并将值存储为函数的一部分,或者简单地检查工作表中的每个值,如果是数字,则应用函数,如果不是,则继续。。。或者任何其他有效的方法

为了澄清,存在没有数据的空白点/区域

例如:

A. B C D E F G H 我 1. 苹果 3. 马铃薯 5. 2. 梨 1. 3. 芹菜 0 4. 胡萝卜 2. 西红柿 4.
在它旁边打开一列,然后在它下面设置类似的内容

=IFS(ISNUMBER(A1)、ROMAN(A1)、NOT(ISNUMBER(A1))、“”)

如果原始列困扰您,您可以随时隐藏它,或者更好地执行一个功能,只将您实际想要查看的数据带到另一个选项卡/工作表中。

尝试以下方法:

function convertToRomanNumeral() {
  //this will get the range of the data. Example: A1:G4
  var range = SpreadsheetApp.getActiveSheet().getDataRange();
  //this will return 2 dimensional arrays of values
  var data = range.getValues();
  for( var i = 0; i < data.length; i++ ){
    for( var j = 0; j < data[0].length; j++ ){
      //convert number to roman numeral
      var val = romanize(data[i][j]);
      if(val){
        //change the value of array element if the value if val is not empty. 
        data[i][j] = val;
      }
    }
  }
  //write the changes to sheet
  range.setValues(data);
}


function romanize (num) {
    if (isNaN(num))
      return '';
    else if (parseInt(num) == 0)
      return 0;
    var digits = String(+num).split(""),
        key = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
               "","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
               "","I","II","III","IV","V","VI","VII","VIII","IX"],
        roman = "",
        i = 3;
    while (i--)
        roman = (key[+digits.pop() + (i * 10)] || "") + roman;
    return Array(+digits.join("") + 1).join("M") + roman;
}
函数转换器mannumeral(){
//这将获得数据的范围。示例:A1:G4
var range=SpreadsheetApp.getActiveSheet().getDataRange();
//这将返回值的二维数组
var data=range.getValues();
对于(变量i=0;i
示例:

在运行脚本之前:

运行脚本后:

参考资料:


感谢您的快速回复-不幸的是,由于数据上方的两个文本字段之间存在合并,因此完全向下搜索该列并不太有效。理想情况下,罗马值将在原始单元格中返回(整个文档的布局非常重要)。用户将以非罗马数字输入数据,因此无法隐藏该列,并且不希望有一个非常难以拉出的单独选项卡/工作表。您是否可以在没有合并单元格的另一个选项卡上重新生成文档,并将其用作最终用户可以填充的数据选项卡,以便您可以使用类似查询功能的功能将另一个选项卡上的数据显示为仪表板?我可以,尽管目标是有一个登录页。为了澄清这一点,这实际上也是出于美学目的。用户只需键入罗马数字即可。。要求的最高数字是10。。所以真的没那么专业。我有它的工作,代码只是臃肿和效率低下。我确实改进了它,使用if语句验证了一个数字,从而减少了需要隐藏的错误数量。所以谢谢你:)啊。如果appscript在工作中没有被阻止,我可以做的事情。这是一个非常好的解决方案。它完美无瑕,这正是我想要弄明白的。非常干净的解决方案,无论文档大小都可以缩放。而不是我试图手动设置和复制每个范围。非常感谢。现在要了解此魔法的工作原理:)