【问题标题】:for loop iteration and replaceTextfor循环迭代和replaceText
【发布时间】:2013-03-23 01:14:32
【问题描述】:

我已将脚本更改为以下内容:

  function readRows(){
   var nums = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"];

   function toText(num) {
   var s;
   if (num >= 100)
    throw "Too big";
   if (num > 10) {
    if (num < 20) {
        switch (num) {
            case 11:
                return "Eleven";
            case 12:
                return "Twelve";
            case 13:
                return "Thirteen";
            case 14:
                return "fourteen";
            case 15:
                return "Fifteen";
            case 16:
                return "sixteen";
            case 17:
                return "seventeen";
            case 18:
                return "eighteen";
            case 19:
                return "nineteen";
            default:
                return toText(num-10)+"teen";
        }
    }

    switch (Math.floor(num / 10)) {
        case 2:
            s = "Twenty";
            break;
        case 3:
            s = "Thirty";
            break;
        case 4:
            s = "Fourty";
           break;
        case 5:
            s = "Fifty";
            break;
        case 6:
            s= "SiXty";
            break;
        case 7:
            s = "Seventy";
            break;
        default:
            s = toText(Math.floor(num/10))+"ty";
            break;
    }
    if(num > 20 && num < 30)
       {
        return "twenty"+toText(num-20);
       }
    if(num > 30 && num < 40)
       {
        return "thirty"+toText(num-30);
       }
    if(num > 40 && num < 50)
       {
        return "fourty"+toText(num-40);
       }
    if(num > 50 && num < 60)
       {
        return "fifty"+toText(num-50);
       }
    if(num > 60 && num < 70)
       {
        return "sixTy"+toText(num-60);
       }
    if(num == 70)
       {
        return "sEvEnty";
       }
    if (num % 10 > 0)
        return s + toText(num % 10);
    return s;
    }

    return nums[num];
    }


    var sheet = SpreadsheetApp.getActiveSheet();
    var lastCol = sheet.getLastColumn();
    var length = sheet.getMaxColumns();
    var rows = sheet.getMaxRows();

    var Name = sheet.getRange(2, 2).getValue(); 
    var data = sheet.getRange(2, 1, 2, lastCol);  
    var template = "spreadsheet key";
    var fileName = "Application document template.docx";
    var newFile = DocsList.getFileById(template).makeCopy(Name + " Application for Phase1 NF3").getId();
    var doc = DocumentApp.openById(newFile);
    var body = doc.getActiveSection();

    for(var j=1; j<length; j++)
    {
    body.replaceText("Answer"+toText(j), data[0][j]);   // line 105
    }
    }

在某个阶段,除了更换 70 之外,我几乎可以使用它,做了一些事情,然后没有任何效果。重做了,现在报这个错误 TypeError:无法从未定义中读取属性“1.0”。 (第 105 行,文件“ConvertToDocs”)。 谁能告诉我属性“1.0”可能指的是什么?为什么第一行代码没有显示在代码窗口中?

【问题讨论】:

  • data 被定义为Range,但您试图将其作为二维数组进行访问。您可能想要var data = sheet.getRange(...).getValues(),它将为您提供范围内单元格的内容

标签: javascript arrays text replace google-apps-script


【解决方案1】:

我不知道任何简单的方法,但这是一个蛮力的努力:

var nums = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"];

function toText(num) {
    var s;
    if (num >= 100)
        throw "Too big";
    if (num > 10) {
        if (num < 20) {
            switch (num) {
                case 11:
                    return "Eleven";
                case 12:
                    return "Twelve";
                case 13:
                    return "Thirteen";
                case 15:
                    return "Fifteen";
                case 18:
                    return "Eighteen";
                default:
                    return toText(num-10)+"teen";
            }
        }

        switch (Math.floor(num / 10)) {
            case 2:
                s = "Twenty";
                break;
            case 3:
                s = "Thirty";
                break;
            case 5:
                s = "Fifty";
                break;
            case 8:
                s = "Eighty";
                break;
            default:
                s = toText(Math.floor(num/10))+"ty";
                break;
        }
        if (num % 10 > 0)
            return s + toText(num % 10);
        return s;
    }

    return nums[num];
}

function readRows() {
    var sheet = SpreadsheetApp.getActiveSheet();
    var lastCol = sheet.getLastColumn();
    var length = sheet.getMaxColumns();
    var rows = sheet.getMaxRows();
    for(var i=2; i<rows; i++) // starting from row 2 in sheet
    {
        var Name = sheet.getRange(i, 2).getValue(); 
        var data = sheet.getRange(i, 1, i, lastCol);  
        var template = <spreadsheet key goes here>;
        var fileName = "Application document template.docx";
        var newFile = DocsList.getFileById(template).makeCopy(Name + " Application for   Phase1 NF3").getId();
        var doc = DocumentApp.openById(newFile);
        var body = doc.getActiveSection();

        for(var j=1; j<length; j++)
        {
            body.replaceText("Answer"+toText(j), data[0][j]);
        }
    }
}

由于你的答案少于 100,我只实现了 99。我修改了你的代码,因为其中一些没有意义。

FWIW,内部 for 循环中的 i 修改了外部循环中的 i,因为变量是函数范围的,而不是块范围的。你似乎不需要它,所以我删除了它。

【讨论】:

  • 这是从 0 到 9 工作的。toText() 函数 > 10
【解决方案2】:

不清楚您的问题是什么 - 您在标题中有提示,但在文本中提出了不同的问题。让我们看看我们能做些什么。

首先 - 为什么会出错?这很简单:data 被定义为Range,但您试图将其作为二维数组进行访问。您可能想要var data = sheet.getRange(...).getValues(),它将为您提供范围内单元格的内容

你在那里做了一些奇怪的事情。您使用 .getRange(2, 1, 2, lastCol)', which isA2:x3` 定义数据范围; 2 行,x=maxColumns。稍后,您尝试仅迭代一行和“maxColumns” - 某些内容不正确,但只有您知道您想要做什么。

第二 - 你提到循环。你有一个数组迭代错误:你正在像这样循环 - for(var j=1; j&lt;length; j++)。问题在于数组从 0 开始,因此在访问 data[][j] 时会跳过第一个元素。

第三 - 你提到了Document.replaceText()。你没有说你遇到了什么问题,但可能是你没有得到替换,因为你没有在文档中找到文本。根据您的代码,以下是一些可能的解释:

  1. 错别字/不一致的大小写。 “SiXty”、“十三”、“十四” - 除非您的模板有完全相同的错误,否则您的匹配将失败。
  2. 空格 - 您正在搜索 "Answer"+toText(j),您可能想要 "Answer "+toText(j)
  3. 连字符和更多大写问题 - 数字通常带有连字符,例如二十一。此外,这种情况下的“一”不是大写的。但您的模板可能不同意 - 请确保您匹配它。

最后,您没有问什么,但您发布的代码主要是关于什么 - 将数字转换为英文字符串表示。您可以而且应该简化您的 toText() 函数。此类问题包含可用于简化解决方案的模式。你是其中的一部分 - 基本上,你有一组子数只能用它们自己来表示(零,一,二......十九),另一组是复合数(二十[-blah ],三十[-blah] ...)。因此解决方案是将这两个组分开,并使用简单的数组来查找适当的文本。

function toText(num) {
  if (num >= 100) throw new Error("Too big");
  if (num < 0) throw new Error("Negative");
  if (num - Math.floor(num) > 0) throw new Error("Not Integer");

  var smallnums = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
                 "Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"];
  var tens = ["","","Twenty","Thirty","Fourty","Fifty","Sixty","Seventy","Eighty","Ninety"];
  var s = "";

  // Is this number in the smallnums set?
  if (num < smallnums.length)
    s = smallnums[num];
  else {
    // No, so express the 'tens', then (maybe) the 'ones'.
    s += tens[Math.floor(num/10)];
    var remnant = num % 10;
    if (remnant > 0) s += "-" + smallnums[remnant].toLowerCase();
  }
  return s;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 2012-06-27
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多