2016-08-12 9 views
1

Google Apps ScriptでJavascriptを使用してオブジェクトから配列を生成しようとしているため、配列をシートに書き込むことができます。私は一意の番号で識別される各人のオブジェクトを含むオブジェクトcampersを持っています。人の記録にアクセスしようとすると、私は不明確になる。ここでは機能があります:オブジェクトが提供するキーを使用してオブジェクトの値にアクセスできないのはなぜですか?

function processData(data){ // Returning from client with full object - parse and write to spreadsheet 
    Logger.log(data) 
    var campers = data; // All camper data and headers 
    var headers = campers.headers; // Array of ordered questions 
    var nHeaders = headers.length; 
    var array = []; // Array to build - each row is one camper 

    for (uid in campers){ // All objects in campers object 
    if (uid!='headers'){ // want campers only 
     Logger.log(uid); 
     Logger.log(campers[uid]); 
     var row = []; 
     for (var j=0; j<nHeaders; j++){ // Go through all questions 
     if(campers[uid][headers[j]]) row.push(campers[uid][headers[j]]); // Add that value to the array if it exists 
     else row.push(null); 
     } 
     array.push(row); 
    } 
    } 
    var final = ss.getSheetByName('ParseUpload'); 
    final.getRange("A1").offset(0,0,array.length, nHeaders).setValues(array); 
    return; 
} 

私はそれを実行すると、私は次のログを取得する:

[16-08-12 02:07:31:240 PDT] {headers=[Card Number, Unique ID, Last Name, First Name, Email, Status], 123456={Status=Non-Attend, Unique ID=123456, [email protected], First Name=John, Card Number=456789012, Last Name=Doe}, 987654={Status=Attend, Unique ID=987654, [email protected], First Name=Jane, Card Number=5, Last Name=Doe}, 1234567={Status=Attend, Unique ID=1234567, [email protected], First Name=John, Card Number=123456789, Last Name=Smith}} 
[16-08-12 02:07:31:298 PDT] 123456 
[16-08-12 02:07:31:299 PDT] undefined 
[16-08-12 02:07:31:300 PDT] 987654 
[16-08-12 02:07:31:301 PDT] undefined 
[16-08-12 02:07:31:301 PDT] 1234567 
[16-08-12 02:07:31:302 PDT] undefined 

、それは間違いなくcampersに重要であるuidの値は、campers[uid]ため、undefinedを返しますということですなぜ?私は同様の質問を検索し、括弧表記を使ってオブジェクトにアクセスする方法のリファレンスを見つけましたが、定義されているものに定義されていないものは何もありませんでした。これが本当に重複している場合は、私がここで紛失しているか、別の質問に私を導いていることが明らかであることを教えてください。

はここdataの構造です:私は上記の構造を利用した機能に直接campersを定義する場合

{ 
    "headers": ["Card Number", "Unique ID", "Last Name", "First Name", "Email", "Status"], 
    "123456": { 
     "First Name": "John", 
     "Unique ID": 123456, 
     "Email": "test3#test.edu", 
     "Card Number": 456789012, 
     "Last Name": "Doe", 
     "Status": "Non-Attend" 
    }, 
    "987654": { 
     "First Name": "Jane", 
     "Unique ID": 987654, 
     "Email": "[email protected]", 
     "Card Number": 5, 
     "Last Name": "Doe", 
     "Status": "Attend" 
    }, 
    "1234567": { 
     "First Name": "John", 
     "Unique ID": 1234567, 
     "Email": "[email protected]", 
     "Card Number": 123456789, 
     "Last Name": "Smith", 
     "Status": "Attend" 
    } 
} 

EDIT 、それが正常に動作します:

function processData(){ 
    var campers = { 
    "headers": ["Card Number", "Unique ID", "Last Name", "First Name", "Email", "Status"], 
    "123456": { 
     "First Name": "John", 
     "Unique ID": 123456, 
     "Email": "[email protected]", 
     "Card Number": 456789012, 
     "Last Name": "Doe", 
     "Status": "Non-Attend" 
    }, 
    "987654": { 
     "First Name": "Jane", 
     "Unique ID": 987654, 
     "Email": "[email protected]", 
     "Card Number": 5, 
     "Last Name": "Doe", 
     "Status": "Attend" 
    }, 
    "1234567": { 
     "First Name": "John", 
     "Unique ID": 1234567, 
     "Email": "[email protected]", 
     "Card Number": 123456789, 
     "Last Name": "Smith", 
     "Status": "Attend" 
    } 
} 
    var headers = campers.headers; // Array of ordered questions 
    var nHeaders = headers.length; 
    var array = []; // Array to build - each row is one camper 

    for (uid in campers){ // All objects in campers object 
    if (uid!='headers'){ // want campers only 
     Logger.log(uid); 
     Logger.log(campers[uid]); 
     var row = []; 
     for (var j=0; j<nHeaders; j++){ // Go through all questions 
     if(campers[uid][headers[j]]) row.push(campers[uid][headers[j]]); // Add that value to the array if it exists 
     else row.push(null); 
     } 
     array.push(row); 
    } 

    } 
    Logger.log(array); 
    //var final = ss.getSheetByName('ParseUpload'); 
    //final.getRange("A1").offset(0,0,array.length, nHeaders).setValues(array); 
    return; 
} 

は、このヘルプをしていますか?たぶん誰かがなぜローカルで定義されたcampersが動作するのかを見ることができますが、dataとして渡されたときには動作しません。

EDIT 2 は、私は、関数の残りの部分を変更せずに、いくつかの追加のロギングを試してみました:

var keys = Object.keys(campers); 
Logger.log(keys) 
for (var uid in campers){ // All objects in campers object 

    if (uid!='headers'){ // want campers only 
    Logger.log(uid); 
    Logger.log(keys.indexOf(uid)); 
    Logger.log(campers[uid]); 
    Logger.log(campers[keys[0]]); 
    Logger.log(campers[Object.keys(campers)[0]]); 
    Logger.log(campers[123456]); 
    Logger.log(campers['123456']); 
    var row = []; 
    for (var j=0; j<nHeaders; j++){ // Go through all questions 
     if(campers[uid][headers[j]]) row.push(campers[uid][headers[j]]); // Add that value to the array if it exists 
     else row.push(null); 
    } 
    array.push(row); 
    } 
} 

はここで結果のログです:

[16-08-12 07:37:57:069 EDT] [123456, 987654, 1234567, headers] 
[16-08-12 07:37:57:070 EDT] 123456 
[16-08-12 07:37:57:072 EDT] 0.0 
[16-08-12 07:37:57:073 EDT] undefined 
[16-08-12 07:37:57:074 EDT] undefined 
[16-08-12 07:37:57:075 EDT] undefined 
[16-08-12 07:37:57:075 EDT] undefined 
[16-08-12 07:37:57:076 EDT] undefined 

のでuidはリストに発見されましたキーが、値は何とかアクセスできないようです。 UGH!

+0

あなたの 'uid'はグローバル変数です。 'uid'を変更する他の関数はありますか? – melpomene

+0

@melpomene:たとえそれがあったとしても、その機能が 'Logger.log(uid);'と 'Logger.log(campers [uid]);の間で実行される機会はありません。 –

+0

@ Tiffany:' Logger.log (JSON.stringify(data)) 'log? –

答えて

0

問題の原因はまだ分かりませんが、修正が見つかりました。にオブジェクトを変換し、いくつかの理由

var data2 = JSON.stringify(data); 
var campers = JSON.parse(data2); 

:TJ.CrowderのコメントJSON.stringify(data)結果を表示するために私を求めて、オブジェクトが標準のJavaScriptオブジェクトでない場合不思議のおかげで、私は、関数に入るときに次のことを試してみましたJSON文字列はすぐにオブジェクトに戻ります。

関連する問題