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: Cannot read property "1.0" from undefined というエラーが発生しました。(105 行目、ファイル「ConvertToDocs」)。プロパティ「1.0」が何を指しているのか、誰か教えてもらえますか? コードの最初の行がコード ウィンドウに表示されないのはなぜですか?

4

2 に答える 2

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ループは外側ループのを変更します。i必要ないようでしたので削除しました。

于 2013-03-23T01:38:38.813 に答える
0

あなたの質問が何であるかは明確ではありません.タイトルにヒントがありますが、テキストでは別のことを尋ねてください. 何ができるか見てみましょう。

まず- なぜエラーが発生するのですか? 簡単です:dataは として定義されてRangeいますが、2 次元配列としてアクセスしようとしています。おそらく、範囲内のセルの内容var data = sheet.getRange(...).getValues()を取得できる が必要でした。

あなたはそこで何か他の奇妙なことをしています。.getRange(2, 1, 2, lastCol)', which isA2:x3`;でデータ範囲を定義します。2 行、x=maxColumns。その後、1 つの行と 'maxColumns' だけを反復しようとします。何かが正しくありませんが、自分が何をしたいのかを知っているのは自分だけです。

2番目-ループについて言及しました。Array Iteration Bug: You're looping like this - for(var j=1; j<length; j++). 問題は、配列が 0 から始まるため、アクセスするときに最初の要素をスキップすることdata[][j]です。

3番目-あなたが言及しDocument.replaceText()ます。どのような問題が発生しているのかはわかりませんが、ドキュメント内のテキストが見つからないために置換が行われていない可能性があります。あなたのコードに基づいて、これについていくつかの可能な説明があります:

  1. タイプミス/一貫性のないケース。"SiXty"、"Thirteen"、"fourteen" - テンプレートにまったく同じ間違いがない限り、マッチングは失敗します。
  2. スペース - あなたが探しているのは"Answer"+toText(j)、おそらく"Answer "+toText(j).
  3. ハイフンとその他の大文字と小文字に関する問題 - 数字は、多くの場合、ハイフンでつながれます (例: Twenty-one)。さらに、この場合の「1」は大文字ではありません。ただし、テンプレートが一致しない場合があります。一致するようにしてください。

最後に、質問しないことですが、投稿されたコードのほとんどは何ですか - 数値を英語の文字列表現に変換します。関数を単純化できますし、単純化する必要がありますtoText()。この種の問題には、ソリューションを単純化するために利用できるパターンが含まれています。あなたは途中でした-基本的に、それ自体の観点からのみ表現できるサブ番号のセット(0、1、2...9)と、合成された別のセット(20 [-blah ]、30[-何とか]...)。したがって、解決策は、これら 2 つのグループを分離し、単純な配列を使用して適切なテキストのルックアップを実行することです。

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 に答える