スイッチサイエンスのWebページが更新されて、商品一覧から在庫数を確認しにくくなりました。委託販売をお願いしている自分としては、自分の商品の在庫数を確認したいのですが、これがやりにくくなってしまいました。
そこでGAS (Google Apps Script)の勉強がてらに、Googleスプレッドシートに書いてある商品番号(SKU)の在庫数を取得して在庫数のシートを更新するのをやってみました。方針は単純で、指定したSKUの商品ページをHTMLで取得(そのURLはSKUから機械的に作成できる)し、その中に書いてある在庫数を切り出して記録する、というものです。
まずGoogleスプレッドシートで、調べたいSKUがB列に入っているシートをつくります。わかりやすいようにA列には商品名を書いておきます。
この表に対して、B列に入っているそれぞれのSKUの商品の在庫数を取得してC列に記入するのをGASでやってみます。
まずこのシートの「拡張機能」→「Apps Script」を選ぶと、Google Apps Scriptの編集画面が開きます。左上にスクリプト名をつけられますので、「SS在庫チェック」みたいな感じにしておくとよいでしょう(SS=スイッチサイエンス)。
コード.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しておきます)
これを「トリガー」から、シートの起動時、を指定しておくと、このシートを開くと自動で在庫数が更新されるようになります。
定期的に在庫数を取得して1週間ごとのグラフにする、なんてこともできそうですね。