0

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

  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”可能指的是什么?为什么第一行代码没有显示在代码窗口中?

4

2 回答 2

0

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

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

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

第二- 你提到循环。你有一个数组迭代错误:你像这样循环 - for(var j=1; j<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;
}
于 2013-06-13T16:59:54.283 回答
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,i内部 for 循环中的 the 修改了i外部循环中的,因为变量是函数范围的,而不是块范围的。你似乎不需要它,所以我删除了它。

于 2013-03-23T01:38:38.813 回答