2013-03-23 4 views
0

Я изменил сценарий к следующему:для итерации цикла и ReplaceText

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»? Почему первая строка кода не отображается в окне кода?

+0

'data' определяется как' Range', но вы пытаетесь получить к нему доступ в виде двумерного массива. Вероятно, вы захотели «var data = sheet.getRange (...). GetValues ​​()», что даст вам * содержимое * ячеек в диапазоне. – Mogsdad

ответ

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 во внутреннем цикле обработки изменяет i во внешнем цикле, поскольку переменные являются областью действия, а не областью охвата. Кажется, вам это не понадобилось, поэтому я удалил его.

+0

Работает от 0 до 9. Функция toText()> 10 <20 не подбирает «een» в подростковом возрасте и не подбирает синглы между 20 - 30 - 40 - 50 - 60 - 70. – user1070396

+0

Почти получил его. Это пересмотренный код – user1070396

0

Непонятно, каков ваш вопрос - у вас есть подсказки в заголовке, но задайте в тексте что-то другое. Давайте посмотрим, что мы можем сделать.

Первый - почему ошибка? Это легко: data определяется как 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. Hyphens & Другие проблемы с капитализацией - номера часто дешифрируются, например. Двадцать один. Кроме того, «один» в этом случае не капитализируется. Но ваш шаблон может не согласиться - убедитесь, что вы его соответствуете.

Наконец, что вы не просите, но то, что ваш код размещен в основном о - преобразование числа в английском языке строковое представление.Вы можете и должны упростить свою функцию toText(). Такая проблема содержит шаблоны, которые можно использовать для упрощения решения. Вы были частью пути - в основном, у вас есть один набор подкатегорий, которые могут быть выражены только в терминах самих себя (ноль, один, два ... девятнадцать), а другой набор, который представляет собой композиты (двадцать [-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; 
} 
Смежные вопросы