2017-09-13 15 views
1

シートから一連の値に基づいて辞書を作成する機能があります。次に、キーを使用してそのシートから値の1つを取り出します。それは、コンソールにログを記録するために正常に動作します。しかし、ifステートメントでは、構文エラーとは何も言わない。私はそれを把握することはできません。ここで、クラッシュする関数とコードを示します。この問題はforループでのみ発生し、その外側では発生しません。Google Apps Script辞書の構文エラー

//creates dictionary 
function columnLocationWithNotation(notation) { 
    var spreadsheet = SpreadsheetApp.openByUrl(); 
    var sheet = spreadsheet.getActiveSheet(); 
    var data = sheet.getDataRange(); 
    var cells = data.getValues(); 
    var dictionary = {}; 

    switch (notation) { 
    case "zeroIndex": 
     for (var i = 0; i < sheet.getLastRow(); i++) { 
     dictionary[cells[i][0]] = cells[i][1] 
     } 
     return dictionary 
     break; 
    case "regularIndex": 
     for (var i = 0; i < sheet.getLastRow(); i++) { 
     dictionary[cells[i][0]] = cells[i][2] 
     } 
     return dictionary 
     break; 
    case "string": 
     for (var i = 0; i < sheet.getLastRow(); i++) { 
     dictionary[cells[i][0]] = cells[i][3] 
     } 
     return dictionary 
     break;    
    } 
} 

var master0indexDictionary = columnLocationWithNotation("zeroIndex") 

for (var i = 1; i =< (sheet.getLastRow() - 1); i++) { 
    var phone = master0indexDictionary["Tutor Name"] 
    if (cells[i][phone] === phoneNumber) { //LINE WITH SYNTAX ERROR 
    //do something 

} 
+1

if(cells [i] [phone] === phoneNumber){''の行には '' cells''が定義されていないようです。 '' columnLocationWithNotation() ''で定義された '' cells''は、関数の外部では使用できません。 if(cells [i] [phone] === phoneNumber){''で '' cells''が同じスコープで定義されていれば、あなたの個人情報なしでエラーメッセージとスクリプト全体について教えてください。 – Tanaike

答えて

1

スクリプトには他にも多くの問題がありますが、問題を引き起こしているのはハイライト表示されていません。 JavaScriptには'= <'という演算子はありません。代わりに「< =」を使用してください:Tanaikeが指摘したように

for (var i = 1; i <= (sheet.getLastRow() - 1); i++) { 

はまた、あなたの「細胞」変数は、あなたの「columnLocationWithNotation(表記)」機能のコンテキストで定義されてはありませんグローバルな文脈からアクセス可能でなければならない。グローバルに定義された変数は、グローバルオブジェクト内で宣言した関数から見ることができますが、その逆はできません。 'シート'変数にも同じことが適用されます。 「phoneNumber」変数は、少なくとも提供したコードのスニペットでは定義されていないようです。

が ''の後にの後に 'return'のステートメントが冗長であることに注意してください。

return dictionary; 
     break; 

あなただけの休憩を使用せずに「スイッチ」文の外に戻るか、休憩を残して、単一「リターン」「スイッチ」文を置くことができます。

最後に、常に行末にセミコロンを付けます。そうすることで、JSパーサーの潜在的な落とし穴や問題を回避できます。あなたはセミコロンを省略どこ私はいくつかのインスタンスに気づいた:あなたはその正当な場所にセミコロンを置くことの習慣を持っていない場合

return dictionary 
     break;  

    var phone = master0indexDictionary["Tutor Name"] 

は、たとえば、次のコードは解除されますが

var a = {name: 'John'} //no semicolon 
[a].forEach(function(element) { 
    Logger.log(element); //logs undefined 
    }) 

JSパーサーはこのコードを1行として扱いますので、'a''forEach()'ループを配列に呼び出すまでに ''が未定義の 'になります。

関連する問題