GASやJavaScript では、「for in」ループまたは「for of」ループを使用して連想配列(オブジェクト)を回すことができます。
連想配列とずっと呼んでいましたが、、、JavaScriptには連想配列は無いようです。
「for in」ループ
例えば、以下のようなコードの連想配列(オブジェクト)の値をA列に書き込む場合を考えてみます。
function AssociativeArray() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シート1");
const person = {
id:101,
name: "Yamada Taro",
age: 30,
city: "Tokyo"
};
}
まずは「for…in」ループを使ってみます。「for…in」ループは、オブジェクトのプロパティ名を反復処理するために使用されます。
function AssociativeArray() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("シート1");
const person = {
id:101,
name: "Yamada Taro",
age: 30,
city: "Tokyo"
};
for (let key in person) {
console.log(key + ': ' + person[key]);
}
}
情報 id: 101
情報 name: Yamada Taro
情報 age: 30
情報 city: Tokyo
あとは、
for (let key in person) {
console.log(key + ': ' + person[key]);
sheet.getRange(key.length, 1).setValue(person[key]);
}
変数keyでキーが、変数person[key]で値が取得できています。
例えば、A列にキー、B列に値を入れたいと思った場合は、下記のような感じで表示できます。
let row = 1;
let col = 1;
for (let key in person) {
console.log(key + ': ' + person[key]);
sheet.getRange(row, col).setValue(key);
sheet.getRange(row, col+1).setValue(person[key]);
row++;
}
key、person[key]でそれぞれの配列の中身が入りました。
「for…of」ループ
[rml_read_more]
「for…of」ループは、配列やオブジェクトの要素を反復処理するために使用されます。
const person = {
id: 101,
name: "Yamada Taro",
age: 30,
city: "Tokyo"
};
for (let value of Object.values(person)) {
console.log(value);
}
情報 101
情報 Yamada Taro
情報 30
情報 Tokyo
値が取得できました。
TypeError: person is not iterable
for (let value of person)のような書き方で実行してみます。
for (let value of person) {
console.log(value);
}
そうすると、下記のようなエラーが出ます。
エラー
TypeError: person is not iterable
AssociativeArray @ コード.gs:22
エラーの原因
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/is_not_iterable
for…of の右辺、 Promise.all や TypedArray.from などの引数として指定された値が反復可能オブジェクトではありません。反復可能なものは、Array、String、Map 等のような組み込み反復可能型や、ジェネレーターの結果、反復可能プロトコルを実装しているオブジェクトが成ることができます。
JavaScript では、 Object は反復可能プロトコルを実装していない限り反復処理できません。したがって、オブジェクトのプロパティを反復処理するために for…of を使用することはできません。
「for…of」ループでキーを取得する
例えば、Object.keysを使って、このように書くことで、キーを取得できます。
for (let value of Object.keys(person)) {
console.log(value);
}
情報 id
情報 name
情報 age
情報 city
まとめ
「for…in」ループまたは「for…of」ループを使用して連想配列(オブジェクト)を回すことができます。
ループでセルに値を書き込みたいときなどに活用できます。