5
3

More than 1 year has passed since last update.

GASでスイッチサイエンスの在庫数を取得して表にまとめてみた

Last updated at Posted at 2022-10-21

スイッチサイエンスのWebページが更新されて、商品一覧から在庫数を確認しにくくなりました。委託販売をお願いしている自分としては、自分の商品の在庫数を確認したいのですが、これがやりにくくなってしまいました。

そこでGAS (Google Apps Script)の勉強がてらに、Googleスプレッドシートに書いてある商品番号(SKU)の在庫数を取得して在庫数のシートを更新するのをやってみました。方針は単純で、指定したSKUの商品ページをHTMLで取得(そのURLはSKUから機械的に作成できる)し、その中に書いてある在庫数を切り出して記録する、というものです。

まずGoogleスプレッドシートで、調べたいSKUがB列に入っているシートをつくります。わかりやすいようにA列には商品名を書いておきます。
image.png

この表に対して、B列に入っているそれぞれのSKUの商品の在庫数を取得してC列に記入するのをGASでやってみます。

まずこのシートの「拡張機能」→「Apps Script」を選ぶと、Google Apps Scriptの編集画面が開きます。左上にスクリプト名をつけられますので、「SS在庫チェック」みたいな感じにしておくとよいでしょう(SS=スイッチサイエンス)。
image.png

コード.gsのところにスクリプトを書くわけですが、そこに以下のようなスクリプトを書いておきます。基本的にJavaScriptに近い文法です。

function checkStock(){
  start = 2; // 開始列数
  end = 100; // 終了列数(空欄は在庫数取得をスキップするので大きめの値を書いておけばOK)

  sheet = SpreadsheetApp.getActiveSpreadsheet(); // 表を取得
  skus = sheet.getRange('B'+start.toString()+':B'+end.toString()).getValues(); // 在庫数を取得するSKUの配列を表から取得
  nums = [];
  for (let sku of skus){ // 指定範囲のSKUに対して順に:
    if (sku.toString().length > 1){ // SKUが空欄でなかったら、その商品の在庫数を取得
      num1 = []; num1.push(getStock(sku));
    }
    else{
      num1 = ['']; // SKUが空欄だったら在庫数は取得せずに空欄としておく
    }
    nums.push(num1); // 在庫数の配列にその結果を追加
  }
  sheet.getRange('C'+start.toString()+':C'+end.toString()).setValues(nums); // 在庫数の配列を表のC列に書き込み

  date = new Date();
  date = Utilities.formatDate(date, "Asia/Tokyo", "yyyy/MM/dd hh:mm:ss");
  sheet.getRange('C1').setValue('在庫数('+date+')'); // 在庫数取得の日時をC1に記録しておく
}

function getStock(sku) {
  const options = {
    "muteHttpExceptions" : true,
  }
  try {
    res = UrlFetchApp.fetch("https://www.switch-science.com/products/"+sku.toString(), options); // URLを指定してSKU番号=skuの商品ページを取得(存在しないSKUなどのエラーの場合もあるので、optionsでエラー無視を指定)
    if (res.getResponseCode() == 200){ // OKの場合
      text = res.getContentText();
      posS = text.indexOf('在庫数');
      posE = text.indexOf('</p>', posS);
      line = text.slice(posS, posE).split(' '); // 取得した商品ページのHTMLから在庫数を切り出し
      num = line[1]; // 変数はグローバルなので、他の関数で使っている変数名はだめ(これでハマったのでメモ)
    }
    else{ // 指定したSKUの商品ページが存在しないなどのエラーのとき
      num = -1
    }
  } catch(e) {
    console.log('Error:')
    console.log(e)
  }
  return(num);
};

上の「実行」ボタンで"checkStock"関数を実行すると、表のC列に在庫数がはいります。(初回実行時のみ、認証と実行の許可を求められるのでOKしておきます)

image.png

image.png

これを「トリガー」から、シートの起動時、を指定しておくと、このシートを開くと自動で在庫数が更新されるようになります。

定期的に在庫数を取得して1週間ごとのグラフにする、なんてこともできそうですね。

5
3
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
5
3