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!
あなたの 'uid'はグローバル変数です。 'uid'を変更する他の関数はありますか? – melpomene
@melpomene:たとえそれがあったとしても、その機能が 'Logger.log(uid);'と 'Logger.log(campers [uid]);の間で実行される機会はありません。 –
@ Tiffany:' Logger.log (JSON.stringify(data)) 'log? –