どうも。つじけ(tsujikenzo)です。今日は小ネタで『Object.entries()メソッドはスプレッドシートと相性が良い』についてご紹介します。
よくある納品書作成業務
とある納品先には、納品前に「納品書」を作成してPDFを送信します。
[数量]だけ毎回変更する必要があるような業務をイメージしてください。今回は(ちょっと実用的ではありませんが、説明したい趣旨とは異なる為GASから入力します)分割代入で一気に代入してしまいます。
const [potate, chineseYam, carrot] = [10,20,30];
一方、この取引は商品ごとに生産者さんにも納品の報告書が必要だとします💦
なんだか地味に手作業のやつですよね~。。。いろんな業務効率化のやり方があるんですが、スプレッドシートに[=’じゃがいも’!B12]のような式を入力しといてもいいのですが、私は[シートには式は書かない]というポリシーでやってますので、GASオンリーで解決していきたいと思います。
今回はObject.entries()メソッドを使ったやり方をご紹介します。
Object.entries()メソッドとは
公式ドキュメントによると、Object.entries() メソッドは、引数に与えたオブジェクトが所有する、文字列をキーとした列挙可能なプロパティの組 [key, value] からなる配列を返します。
とのことです。が文字で書くとなんだか分かりづらいですよね。。。公式に載ってるコードを引用しますと、
const person = {
name: ‘tsujike’,
age: 42
};
for (const [key, value] of Object.entries(person)) {
console.log(`${key}: ${value}`);
}
このように、for of文との相性が非常によく、key(ここで言う’name’や’age’)とvalue(ここで言う’tsujike’と’42’)を操作するのに重宝します。
オブジェクトとシート名を渡すとセルに入力してくれる関数
Object.entries()メソッドのkeyを文字列として返す仕様は、セルのアドレスと相性が非常にいいです。プロパティキーにセルのアドレスを持たせることにより、for of文の分割代入でsetValueすることができます。
const object = {B12:100};
for(const [cell, value] of Object.entries(obj)){
sheet.getRange(cell).setValue(value)
}
これは使いまわしができそうですね。関数(パーツ)化しちゃいましょう。
/**オブジェクトとシート名を渡すとセルに入力してくれる関数
*
*param {obj} data
*param {string} sheet_name
*/
function setValueToSpreadsheet(obj, sheetName){
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
for(const [cell, value] of Object.entries(obj)){
sheet.getRange(cell).setValue(value)
}
}
「納品書」に値を入力
それでは実際にスプレッドシートへ入力するコードを書いてみましょう。まずは「納品書」です。
const [potato, chineseYam, carrot] = [100,200,300];
const sheetName = '納品書';
const quantity = {
B10:potato,
B12:chineseYam,
B14:carrot
}
setValueToSpreadsheet(quantity, sheetName)
おおお👏
各商品納品書のセル[B12]に数量を入れる
応用編です。各シート名を配列に代入して、forEach()メソッドでループを回しながらvaluesを一つずつオブジェクトのB12:〇〇に代入しています。
const [potato, chineseYam, carrot] = [2,4,6];
const values = [potato, chineseYam, carrot];
const quantity = {};
const sheetsName = ['じゃがいも', 'ながいも', 'にんじん'];
sheetsName.forEach((sheetName,index) => {
quantity['B12'] = values[index];
setValueToSpreadsheet(quantity, sheetName);
}
)
おおお👏👏
コード整理
さて、お待たせしましたコピペで動かせるコードですw
function myFunction(){
let quantity = {};
const [potato, chineseYam, carrot] = [10,20,30];
const values = [potato, chineseYam, carrot];
//各品目ごとのシートに出力
const sheetsName = ['じゃがいも', 'ながいも', 'にんじん'];
sheetsName.forEach((sheetName,index) => {
quantity['B12'] = values[index];
setValueToSpreadsheet(quantity, sheetName);
}
)
//オブジェクトをリセット
quantity = {};
//納品書に出力
const sheetName = '納品書';
quantity['B10'] = potato;
quantity['B12'] = chineseYam;
quantity['B14'] = carrot;
setValueToSpreadsheet(quantity, sheetName);
}
/**オブジェクトとシート名を渡すとセルに入力してくれる関数
*
*param {obj} data
*param {string} sheet_name
*/
function setValueToSpreadsheet(obj, sheetName){
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
for(const [cell, value] of Object.entries(obj)){
sheet.getRange(cell).setValue(value)
}
}
まとめ
以上で『Object.entries()メソッドはスプレッドシートと相性が良い』をお送りしました。オブジェクトのプロパティキーにセルのアドレスを使うとgetRange()メソッドに渡すのにスッキリだなと思ったので小ネタだと思ったら、意外としっかり記事になりましたね💦
2つの配列をforEach()メソッドで同時に回しているのもちょっとしたアイディアです。
GASって楽しいですよね。私の個人的なポリシーとしてどーしても緊急事態以外はセルに式を書きません。あはは。まだまだネタがあるので頑張って書いていきます~。