#はじめに
タイトルを読んでも意味不明だと思うので、まずはこちらの動画を見て欲しい。
【Google Apps Scriptで業務効率化】
— げん げんと (@gento34165638) June 16, 2020
入力された文字を別シートにて検索して、その隣にある文字を書き出す! pic.twitter.com/HGpJIlXw9J
これで大体何を実現したいのか、お分りいただけたかと思う。。
#経緯
僕のパートナーが趣味でアクセサリーと作っているのだが、ある日**「出来上がったアイテムの原価を知りたい!」**というご注文を頂いた。。。
保有する全ての材料は、ご丁寧にスプレッドシートにまとめられているようだ。
使った材料1つあたりの金額 × 使った個数 = 出来上がったアイテムの原価
をスプレッドシートを使って求めたいようだが、、、、
**「使った材料1つあたりの金額」**を、在庫一覧のシートからいちいちコピペするのがめんどくさい!ということで、
####「プログラミングのスキルは、一番身近な人の役に立ってこそだろう!」と思い、この僕が立ち上がったのである。
#全体の流れ
①「作ったアイテム」のシートで入力された材料名をonEdit(e)
で取得
②①で取得した材料名を、同じスプレッドシート内の「在庫」シートにて検索
③「在庫」シートにて検索したセルの、1つ横のセルの値**(これが「材料1つあたりの金額」)**を取得
④①で入力されたセルの1つ横のセルに、③で取得した「材料1つあたりの金額」を書き出す
大体の処理の流れはこんな感じ。
#全てのコード
function onEdit(e) {
var range = e.range;
var value = e.value;
// 編集のあったシート
var sheet = e.source.getActiveSheet();
// 編集したセル
var cell = e.source.getActiveRange();
// シート「作ったアイテム」の2列目のセル(材料名)が編集されたときのみ実行される
if (sheet.getName() == "作ったアイテム" && cell.getColumn() == 2) {
const price = findText(value);
if(price){
cell.offset(0, 1).setValue(price);
}
}
}
function findText(newValue) {
var targetCol = 1;
var ss = SpreadsheetApp.getActiveSpreadsheet();
//シート「在庫」を取得
var sheet = ss.getSheetByName('在庫');
try{
//シート「作ったアイテム」で入力された文字列を探す
var textFinder = sheet.createTextFinder(newValue);
var ranges = textFinder.findAll();
//入力された文字のセル範囲を取得
var textPos = ranges[0].getA1Notation();
//入力された文字の位置を取る
var textPosCell = sheet.getRange(textPos);
//入力された文字の右隣のセルの値を取る
var targetValue = textPosCell.offset(0, 1).getValue();
return targetValue;
}catch(e){
result = "エラーの内容:" + e;
Logger.log(result);
}
}
#軽く解説
##スプレッドシートに編集があった時、発動する
function onEdit(e)
この関数でスプレッドシートに編集があった時、発動するようにしておく。
ただし、このままだと全てのセルに編集があった時に発動してしまうので、このように条件分岐しておく。
// 編集のあったシート
var sheet = e.source.getActiveSheet();
// 編集したセル
var cell = e.source.getActiveRange();
// シート「作ったアイテム」の2列目のセル(材料名)が編集されたときのみ実行される
if (sheet.getName() == "作ったアイテム" && cell.getColumn() == 2) {
const price = findText(value);
if(price){
cell.offset(0, 1).setValue(price);
}
}
##createTextFinderで単語を検索
この関数についてはこちらの記事で詳しく解説されてます
Google Apps Script でスプレッドシート内の文字列を検索する TextFinder を試してみる
なぜranges[0]
となるのか?
var ranges = textFinder.findAll();
var textPos = ranges[0].getA1Notation();
それはfindAll()
で探している為、検索にかけた単語が複数見つかる事もあり得る。なので、ranges
は配列みたいなものという事になる。
#最後に
僕はスプレッドシートが特になってきました。
追記
続きを書きました
【Google Apps Scriptとスプレッドシートで在庫管理】選択範囲の中で取得した値を使って、別シートで計算する