無趣味の戯言

三日坊主なので頑張らないように頑張ります

【GAS】JANコードをピッてするだけである程度商品リストを作ってみる

ピッってするの地味に楽しい←


ASCII Art by: AA変換(アスキーアート生成)|Web便利ツール@ツールタロウ

こんばんは、だいちゃんです。

本格的な(?)プログラムは書けないけど、すぐに結果を体感できるマクロとかHTMLとかは好物です。特にロリコンなのでJSに近いGoogleAppsScriptとかもう///

JANコードだけ控えて商品リストを作る

現物管理だけな倉庫の商品リストを写真付きで作成してほしいという依頼を受けたので、現場に向かいました。数週間単位で滞在できるなら全部確認しながら撮影とデータ入力をすれば済む話なのですが、なんと1日で終わらさないといけない鬼畜スケジュール。とにかく現場での作業は最小限に抑える必要がありました...。

ということで、現場での作業は以下の2つのみ。

  • バーコードをピッする
  • 商品の写真を撮る

バーコードリーダーを始めて使ったのですが、Macでも問題なく使えたし、読み取ったあとにエンター入れてくれるので、IMEをちゃんと半角入力モードにしておけば、エクセルなんかにひたすらJANコードをメモれます。

ひたすら控えたJANコードを整理する:在庫数調べ

まずは在庫の重複を調べます。

現場で「同じの何個あるかな〜」なんて数えてられなかったので、現物すべてスキャンしておきました。その結果、在庫が複数あるときは同じJANコードが在庫数分控えられてるはずです。

ということでCOUNTIF関数を使って同じJANがいくつあるか数えていきます。

まず、JANが入ってる列の右に列を挿入して、IDを振ります。(スキャン順に戻す必要がないならいいけど、後々あると便利だと思う)

次に、JANが入ってる列をソートします。(昇順でも降順でも)

そしてお待ちかねCOUNTIF関数。画像ではC列に入れます。引数は「範囲(JANが入ってる列すべて)」「検索対象(その行のJAN)」です。

ここで、2以上の値が出てくると重複してる商品があります。

このままだと、重複してる分の行を消すとCOUNTIFの計算結果も変わってしまうので、C列をコピー→同じ場所に「値のみ貼り付け」してしまえば、そのまま在庫数として使えます。あとは重複してる行(画像では14行目)を削除して、A列昇順に戻せば完了。

ひたすら控えたJANコードを整理する:Yahoo!ショッピングAPI

ちょっとスプリントを書きます。

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('価格検索')
    .addItem('Y!SHOP価格検索', 'yahoo')
    .addToUi();
};

function yahoo () {
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheetData = book.getSheetByName("シート1");

  var rowEndData = sheetData.getDataRange().getLastRow()

  for (var i = 2; i <= rowEndData; i += 1) {
    if(sheetData.getRange(i, 2).getValue() == null || sheetData.getRange(i, 2).getValue() == ""){
      continue;
    }else{
      var url = 'https://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?appid=●●●アプリケーションID●●●&jan=' + sheetData.getRange(i, 2).getValue() + '&sort=%2Bprice&condition=new';
      var response = UrlFetchApp.fetch(url);
      var html = response.getContentText('UTF-8');

      var searchTag = '<Name>';
      var index = html.indexOf(searchTag)
      if (index !== -1) {
        var htmlans = html.substring(index + searchTag.length);
        var index = htmlans.indexOf('</Name>');
        if (index !== -1) {
          sheetData.getRange(i, 4).setValue(htmlans.substring(0, index));
        }
      }
 
      var searchTag = '<DefaultPrice>';
      var index = html.indexOf(searchTag)
      if (index !== -1) {
        var htmlans = html.substring(index + searchTag.length);
        var index = htmlans.indexOf('</DefaultPrice>');
        if (index !== -1) {
          sheetData.getRange(i, 5).setValue(htmlans.substring(0, index));
        }
      }
    
      var searchTag = '<Small>';
      var index = html.indexOf(searchTag)
      if (index !== -1) {
        var htmlans = html.substring(index + searchTag.length);
        var index = htmlans.indexOf('</Small>');
        if (index !== -1) {
          sheetData.getRange(i, 6).setValue(htmlans.substring(0, index));
        }
      }
    }
      

  }
};

まず、Yahoo!デベロッパーネットワークから新しいアプリケーションとして登録して、アプリケーションIDをもらいます。

アプリケーションの管理:Yahoo!デベロッパーネットワーク

もらったIDをスプリント中の「●●●アプリケーションID●●●」と置き換えればある程度使えるはず。

スプレッドシートを一旦閉じて再度開くとメニューバーに「価格検索」ってメニューが増えててその中に「Y!SHOP価格検索」ってボタンがあるはずなのでそれをクリックすればあとは勝手にヤフーショッピングに出品されている商品のうち、JANコードが同じ・新品・最安の商品の情報(商品名・価格・画像URL)がシート上に書き込まれていきます。

公式がめっちゃ親切なのでパラメータイジるのも余裕かと。

developer.yahoo.co.jp

エラー処理とか全然してないから、止まったらそれまでの行をどこかに退避させて、エラーが出る行は諦めて、って使ってました←

あとは頑張る

image関数を使って「=image(F2,1)」(F列に画像URLがあるとき)とかやればセル内に画像も表示できるので、あとは自力でリストを整えていきます…

特に商品名に「送料無料」とか書かれてることが多いので、そういうのは一気に置換してもいいかも。ビックカメラからスクレイピングで商品名拾うのも作ったけど長くなったのでまた今度。そっちのほうが商品名がまともw

あと、Yahoo!ショッピングの価格は極端なのが多いので本当は数件取得するべきかもしれないですね。ただAPIが整ってて使いやすかったので使ってます。AmazonスクレイピングするとエラーばっかりだしAmazonAPIお金かかるし。

なんか仕事が減ってるのか余計なことをしているのか分かんないけどこういうの動いた時めっちゃ楽しいよねってお話。

▼GoogleAppsScriptで遊んでみた他の記事▼

udcsk.hateblo.jp

udcsk.hateblo.jp