#Webスクレイピング #GAS #最低賃金API が動いていないので作り直す

# 前の記事

この記事は人月シミュレーターで使っている最低賃金APIの作り方です。

せっかく時給が出るので、最低賃金以上かどうかを判定する仕組みを作ろうと思いました。
今回採用しようと思ったのはこちら。

# こんなに頑張ることはなかった

まずはじめに言いますが、ビジネス的には一年に一回ぐらいの更新なので、サイトに行って以下を手打ちするのがベストです。
利用頻度の低いものや、実装難度の高いもの、例外などをシステム化するのはビジネス的にはナンセンスです。

const minimum_wage = {
  ...https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/roudoukijun/minimumichiran/
}

では、本題です。

# データを登録する

最新の手法で対応しました。

こちらには古い手順を残しています。

## データを公開しているサイトをスクレイピングする

とりあえずサクッとやっちゃいましょう。
Githubにソースを全文公開していますので、そちらを参照してください。

function __scraping ()
{
  var html = UrlFetchApp.fetch( PROPERTIES.url ).getContentText( 'UTF-8' ).replace( /\r?\n/g, "" ).replace( /[0-9]/g, function ( word )
  {
    return String.fromCharCode( word.charCodeAt( 0 ) - 0xFEE0 )
  } );
  var start = "<tbody>";
  var end = "</tbody>";
  return __cut( html, start, end );
}

スクレイピングをしている部分はこれだけです。
必要なのは`UrlFetchApp.fetch( PROPERTIES.url )`だけです。
スクレイピング処理はデータを拾ってきた後の方が重要で、データクレンジングが恐ろしく大変です。
replaceで置き換えたりパターンマッチで拾ってきたり、おっそろしく泥臭い事をやる必要があります。

スクレイピングのコツは、データ加工をどれだけ楽にやるかに尽きます。
本スクリプトでも、結構コネコネして100行ぐらいに圧縮しています。
これ以上圧縮すると、回収時に白目になりそうなのでこれ以上のリファクタリングはしません。

### テストデータについて

デバッグのたびにスクレイピングをしていると申し訳ないので、スクレイピング部分が出来たらデータを自分で作ってそちらに切り替えましょう。
スクレイピングはブラウザでのアクセスと変わらない事をやっているので、デバッグのたびに実行されると、いわゆるF5アタックをやっている事になります。

## 加工したデータはスプレッドシートへ

最低賃金は頻繁に更新されるわけではないので、呼び出されるたびにスクレイピングの必要があるわけではないと判断していったんスプレッドシートに格納します。
そもそも最低賃金にリアルタイム性が必要なシーンがどんな状況か想像できないですが^^;

const sheet = SpreadsheetApp.getActiveSheet().getRange( 1, 1, data.length, data[ 0 ].length );
sheet.setValues( data );

データをちまちま登録するより、getRangeで配列の行列を取ってsetValuesで一括登録したほうが早いです。
getRangeで格納したい場所にforで回して一つ一つ入れていく方法もありますが、この方法だと5分の壁にぶつかる可能性があります。

なお、dataは二次配列で格納します。
ヘッダーはないので、必要であれば自分で設定しましょう。

  data.unshift( [ PROPERTIES.code, PROPERTIES.name, PROPERTIES.wage, PROPERTIES.date ] );

# データを提供する

## スプレッドシートからデータを取得する

APIコールされたらスプレッドシートに登録した内容を返すようにします

const sheet = SpreadsheetApp.getActiveSheet();
var alldata = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();

データが入っているセルをgetRangeで指定してgetValuesで拾ってきます。
getValueで一つずつ拾ってくるより、いったん全部持ってきて配列処理の方が早いです。
GASは5分の壁がありますので、負荷が掛かる処理はなるべくやらないのが正道です。

## json形式に加工する

利便性という意味ではgetValuesの値をそのままreturnしてしまった方がいいです。
が、ちゃんとAPIとして使えるようにjsonを作りましょう。
なお、日付部分は日付型として処理されるので、フォーマットを適切に設定する必要があります。

## 値を返す

この記事を書こうと思った発端ですが、GASの場合色々と設定が難しすぎて解説するとテーマが行方不明になったので別記事で詳細を掘り下げます。

# GASでスクレイピング・データを公開を駆け足で解説しました。

ので、ちょっと説明不足かなぁ、と思うところはありますが恐らく実装するという観点では解決できるかと思います。
この記事でうまく行かなかったらコメントを下さい。めっちゃ対応します。

この記事でうまく行った方、❤スキを押してくれると大喜びします。

# 戻る



のむらがあなたの役に立つ記事を書くためのコーヒーを一杯奢ってくれませんか? サポートをすると、のむらの記事を使って、あなたの記事を盛り上げてみませんか? また、有料記事などいただいた収益はすべて、あなたの代わりにアプリやツールを買って色々検証をして記事にするために使っています。