1

ここに、オブジェクトコンストラクターを作成buildList()し、スプレッドシートからデータを取得して、部門名を含む配列を吐き出すスクリプトがあります。私がやろうとしているのbuildObjects()は、その配列を使用して各部門のオブジェクトを作成し、その部門に関連するさまざまな値を入力することです。明らかに私は回線に問題がありますvar ADCnames[i] = new ADC(ADCnames[i]);

function ADC(name) {
  this.name = name;
}

function buildObjects () {
  var ADCnames = buildList('ADC', 1);
  var ADCarray = [];
  for (var i in ADCnames) {
    var ADCnames[i] = new ADC(ADCnames[i][0]);
    ADCarray.push(<<the variable I just created>>);
  }
  return ADCarray;
}

私はオブジェクトを使用するのが初めてなので、私が見逃しているより簡単な方法があるかもしれません。どんな助けでも大歓迎です。

4

2 に答える 2

2

変数の名前を変更するだけです。

試す

function buildObjects () {
  var ADCnames = buildList('ADC', 1);
  var ADCarray = [];
  for (var i in ADCnames) {
    var tempADC = new ADC(ADCnames[i][0]);
    //do whatever else you need to do to this object.
    ADCarray.push(tempADC);
  }
  return ADCarray;
}
于 2013-02-17T17:20:48.280 に答える
1

オブジェクトの属性は、ドット表記またはブラケット表記 (配列など) で割り当てることができます。

代わりにこれを試してください:

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

後者の方法は、入力データがより広範囲であるか、オブジェクト関数による処理が必要な場合にのみ意味を持ち始めます。これは、私の述べた例ではおそらくやり過ぎです。

于 2013-02-17T08:35:42.277 に答える