2016-08-12 1 views
1

배열을 시트에 쓸 수 있도록 Google Apps Script에서 Javascript를 사용하여 객체에서 배열을 생성하려고합니다. 고유 한 번호로 식별 된 각 사람에 대한 개체가 포함 된 개체 campers이 있습니다. 그 사람의 기록에 액세스하려고하면 정의되지 않습니다.개체에서 제공 한 키를 사용하여 개체의 값에 액세스 할 수없는 이유는 무엇입니까?

[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]에 대한 정의되지 않은 리턴되는 이유 : 나는 그것을 실행하면

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; 
} 

, 나는 다음과 같은 로그를 얻을 : 여기에 기능입니다 ? 비슷한 질문을 검색해 괄호 표기법을 사용하여 객체에 액세스하는 방법에 대한 참조를 찾았지만 정의 된 내용에 정의되지 않은 내용은 없습니다. 이것이 실제로 중복되는 경우 여기에 누락 된 내용이나 다른 질문으로 직접 안내하는 내용이 있음을 알려주십시오.

여기 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" 
    } 
} 

편집 , 그것을 잘 작동합니다 :

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으로 전달되면 작동하지 않을 수 있습니다.

나는 함수의 나머지 부분 변경하지 않고, 몇 가지 추가 로깅을 시도 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이 목록에서 발견된다 키,하지만 값이 어떻게 든 액세스 할 수없는 것 같습니다. 어어!

+0

당신의'uid'가 전역 변수라는 것을 봅니다. 다른 함수가'uid'를 수정합니까? – melpomene

+0

@melpomene : 그래도 그 기능이'Logger.log (uid);'와'Logger.log (야영 자 [uid]); 사이에서 실행될 기회는 없습니다. –

+0

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

답변

0

여전히 문제의 원인을 알 수는 없지만 수정 사항을 발견했습니다. A를 객체로 변환, 어떤 이유로

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

: TJ.Crowder의 개의 댓글 JSON.stringify(data) 결과를 보여달라고 요청하고 객체는 표준 자바 스크립트 객체가 아닌 경우 궁금 덕분에, 나는 기능을 입력 할 때 다음과 같은 시도 JSON 문자열을 즉시 다시 개체로 작동합니다.

관련 문제