for循环迭代和replaceText

时间:2013-03-23 01:14:33

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

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

  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:无法从undefined中读取属性“1.0”。 (第105行,文件“ConvertToDocs”)。 任何人都可以告诉我“1.0”属性可能指的是什么?为什么第一行代码没有显示在代码窗口中?

2 个答案:

答案 0 :(得分:0)

我不知道有什么简单的方法,但这是一种蛮力的努力:

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,因为变量是函数作用域,而不是块作用域。你好像不需要它所以我把它删除了。

答案 1 :(得分:0)

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

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

你在做那些奇怪的事情。您可以使用.getRange(2, 1, 2, lastCol)', which is A2:x3`定义数据范围; 2行,x = maxColumns。然后,你尝试迭代一行和'maxColumns' - 有些东西不在那里,但只有你知道你想做什么。

第二次 - 你提到了循环。你有一个Array Iteration Bug:你正在循环这样 - for(var j=1; j<length; j++)。问题是数组从0开始,所以你在访问data[][j]时会跳过第一个元素。

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

  1. 错别字/不一致的情况。 “SiXty”,“十三”,“十四” - 除非您的模板有完全相同的错误,否则您的匹配将会失败。
  2. 空格 - 您正在搜索"Answer"+toText(j),您可能需要"Answer "+toText(j)
  3. Hyphens&amp;更多的资本化问题 - 数字通常是连字符,例如二十一。另外,在这种情况下,“一”不是大写的。但是你的模板可能不同意 - 请确保你匹配它。
  4. 最后,您不会问,但您发布的代码主要是什么 - 将数字转换为英文字符串表示。您可以而且应该简化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;
    }