0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Google Apps Scriptとスプレッドシートで在庫管理】 入力された文字を別シートにて検索し、その隣にある文字を書き出す

Last updated at Posted at 2020-06-17

#はじめに
タイトルを読んでも意味不明だと思うので、まずはこちらの動画を見て欲しい。

これで大体何を実現したいのか、お分りいただけたかと思う。。:sweat_smile:

#経緯
僕のパートナーが趣味でアクセサリーと作っているのだが、ある日**「出来上がったアイテムの原価を知りたい!」**というご注文を頂いた。。。

保有する全ての材料は、ご丁寧にスプレッドシートにまとめられているようだ。

使った材料1つあたりの金額 × 使った個数 = 出来上がったアイテムの原価
をスプレッドシートを使って求めたいようだが、、、、

**「使った材料1つあたりの金額」**を、在庫一覧のシートからいちいちコピペするのがめんどくさい!ということで、

####「プログラミングのスキルは、一番身近な人の役に立ってこそだろう!」と思い、この僕が立ち上がったのである。

#用意するもの
##在庫をまとめたシート
スクリーンショット 2020-06-16 21.22.13.jpg

##作ったアイテムをまとめたシート
スクリーンショット 2020-06-16 21.37.07.jpg

#全体の流れ
①「作ったアイテム」のシートで入力された材料名をonEdit(e)で取得
②①で取得した材料名を、同じスプレッドシート内の「在庫」シートにて検索
③「在庫」シートにて検索したセルの、1つ横のセルの値**(これが「材料1つあたりの金額」)**を取得
④①で入力されたセルの1つ横のセルに、③で取得した「材料1つあたりの金額」を書き出す

大体の処理の流れはこんな感じ。

#全てのコード

コード.gs
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で単語を検索
この関数についてはこちらの記事で詳しく解説されてます:point_down:
Google Apps Script でスプレッドシート内の文字列を検索する TextFinder を試してみる

なぜranges[0]となるのか?

var ranges = textFinder.findAll();
var textPos = ranges[0].getA1Notation();

それはfindAll()で探している為、検索にかけた単語が複数見つかる事もあり得る。なので、rangesは配列みたいなものという事になる。

#最後に
僕はスプレッドシートが特になってきました。

追記
続きを書きました:point_down:
【Google Apps Scriptとスプレッドシートで在庫管理】選択範囲の中で取得した値を使って、別シートで計算する

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?