オブジェクトの属性は、ドット表記またはブラケット表記 (配列など) で割り当てることができます。
代わりにこれを試してください:
this[名前] = 名前;
部門名の「変数」を取得することはありませんが、部門の配列は部門を属性として持つオブジェクトになります。これはあなたが望むものですか?部門名が常に一意である場合、配列 for loo は必要ない可能性があります。
アップデート
余分な配列が不要であることについて、上記の私のポイントを拡張します。あなたが扱っているのは (私が推測する) 固有の部署名であるため、これらがキーになる可能性があります。
そう:
function buildDepartments() {
var departmentList = SpreadsheetApp.getActiveSpreadsheet().getRange('a1:c2').getValues(), // Assuming a 3 column list with, say: department name, department head, department deputy.
departments = {},
d;
for (d = 0; d < departmentList.length; d += 1) {
departments[departmentList[d][0]] = {head: departmentList[d][1], deputy: departmentList[d][2]};
}
// To recall the department details ... however many there are
Logger.log(departments['Math'].head); // Logs the head of the Math department
}
ただし、部門名が変更された場合、変更を行うのが面倒になるため、時間の経過とともに変化する可能性のあるキーに自分自身を結び付けない方が理にかなっている場合があります。また、オブジェクトを「指定解除」すると、ScriptDB を利用しやすくなります。したがって:
function buildDepartments() {
// Assuming a 3 column list with, say: name, head, deputy.
var departmentList = SpreadsheetApp.getActiveSpreadsheet().getRange('a1:c2').getValues(),
departments = [], // Now this an array
d;
for (d = 0; d < departmentList.length; d += 1) {
departments.push({
title: departmentList[d][0],
head: departmentList[d][1],
deputy: departmentList[d][2]
});
}
// To recall the department details ... however many there are
// Logs the head of the Math department by filtering the array to a single entry
Logger.log(departments.filter(function (d) { return d.title = 'Math'; })[0]);
}
この時点で、departments 配列を再びコンストラクター オブジェクトにすることができます。したがって:
function DepartmentList () {
var list = [];
this.addDepartment = function (dept) {
list.push({ title: dept[0], head: dept[1], deputy: dept[2] });
return this; // for chaining reasons, if you like.
}
this.getDepartment() = function(dept) {
var foundDepartment = list.filter(function (d) { return d.title = dept; });
return foundDepartment[0] || {}; // empty object if no department match
}
return list; // bare calls to the object returns the whole list
}
function buildDepartments () {
var departments = SpreadsheetApp.getActiveSpreadsheet().getRange('a1:c2').getValues(),
departmentList = new DepartmentList(), // Now this an object again
d;
departments.forEach( departmentList.addDepartment(entry) ); // Possible because GAS supports ECMAScript5
// To recall the department details ... however many there are
// Logs the head of the Math department
Logger.log(departmentList.getDepartment('Math').head);
}
後者の方法は、入力データがより広範囲であるか、オブジェクト関数による処理が必要な場合にのみ意味を持ち始めます。これは、私の述べた例ではおそらくやり過ぎです。