2017-07-14 30 views
1

次のJavascriptがハングアップしています。私は自分でApps Scriptを教えて、シート上のデータをソートしてきました。私のウェブデベロッパーの友人と私はこの特定のスクリプトがなぜ停止するのかについて最後の2時間は無知でした。それはちょうどスクリプトを永久に実行していると言います....Google Appsスクリプトのハングアップ(javascript)

私は、スプレッドシートのセクションがすでに他の機能の1つで印刷されているカレンダーエリアとして指定されています。テスト目的のために、私はこの関数を分離してダミー配列を与えましたが、関数はカレンダーをループし、 '日付'すなわち1,2,3,4thのCOORDを見つけ、その日付の下の空のセルの座標を返します(私はカレンダーにデータを入れます)。

function printCalendarValues(array){ 
    var array = [0,143,534,342,54,1,41,1]; 
    var Calendar_Display_range = recruiter_sheet.getRange('B8:H19'); 
    var Calendar_Display_values = Calendar_Display_range.getValues();  
    function getCellBelow(day, rangeArray){ 
    for(i=0; i<rangeArray.length; i++){ 
     for(j=0;j<rangeArray[i].length; j++){ 
     if(rangeArray[i][j]==day){ 
      var res = [i+9,j+2]; 
      return res; 
     };   
     }; 
    } 
    }; 
    for(i=0;i<2;i++){ //< ---- THIS IS WHERE IT BREAKS 
    // If I take the code in this for loop out of it and run it 
    // only once then it runs as expected. It breaks when I put it in 
    // this for loop. You can see I only loop twice right now. I 
    // did that for testing, but i've tried twice, or array.length 
    // anything other than running it once breaks it. 
    var cellBelow = getCellBelow(i+1, Calendar_Display_values); 
    recruiter_sheet.getRange(cellBelow[0],cellBelow[1]).setValue(array[i]); 
    }; 
}; 

答えて

1

関数の先頭に変数iを定義する必要があります。

function printCalendarValues(array){ 
    var i;//Define i - its' value will be undefined 

それとも、forパラメータ内varキーワードを追加する必要があります。 for (var i = 0, etc今、変数iはグローバルです。 iの値は「グローバルスコープ」にあります。 実行しているの機能は、今のところはiにアクセスできます。

2番目forループはforループと機能getCellBelowが変数iを共有している両方の、getCellBelow関数を呼び出します。したがって、iは1に設定され、次に関数getCellBelowが呼び出されます。その後、iは0に設定されます。だからあなたのforループは永遠に続くでしょう。それは決して1に達することはありません。getCellBelow機能によって常にゼロに戻されています。

for(i=0;i<2;i++){ //i gets set to zero and then incremented to 1 
    var cellBelow = getCellBelow(i+1, Calendar_Display_values);//function called 

次に、関数getCellBelow;

for(i=0; i<rangeArray.length; i++){//i is set to zero and until the array lengh 

だから、は、1よりも大きくなることがあります。ループfor(i=0;i<2;i++){が停止します。

Logger.log('i: ' + i)ステートメントを追加し、ログを表示すると分かります。 [表示]メニューで、コードを実行した後に[ログ]を選択します。

あなたはする必要がありますi

function getCellBelow(day, rangeArray){関数の内部で定義する必要があります

function getCellBelow(day, rangeArray){ 
    var i; 

ので、その関数内iの使用は機能に限定し、iの他の値に影響を与えないことになりますその機能の外側にある。

関連する問題