いやいや、長々更新をさぼっておりました。
色々忙しくて、日記を書くのが遅れてしまいました。
その分今回はスペシャルとして、youtubeの動画と連動した日記です。具体的には、牛個体識別センターに登録されたデータを、Google SpreadsheetとGoogle Apps Scriptを使って収集する方法を紹介します。文字での解説だけでわかりにくいと思い、youtubeにもその様子をアップロードしますので、皆さんお楽しみください。
日本で出生・死亡・移動した牛には10桁の識別番号が割り振られ、その番号が記載された耳標を耳に打ちます。この番号がデータベースへ登録されることになります。ホルスタインから和牛まで全部ですね。
この番号で検索をすれば、この牛がどこで生まれ、どの様な経路を辿って、どの屠場でお肉になったのがわかる様になってます。肉のパッケージに識別番号が記載されていればですが・・・。
酪農家にとっては、識別センターが一番しっかりした動態管理データになります。何せ自分が保有している牛はすべて登録する事が義務化されているわけですから。
識別センターに登録の申請をし、受理されると以下の様なメールが送られてきます。
インターネットからの届出受付が完了しました。
既に譲渡(転出)している牛の個体情報「出生の年月日、雌雄の別、母牛の個体識別
番号、種別」の修正をした場合には、当該牛の譲渡先の農家に対して、修正を行った
旨を通知し、その内容の説明を行っていただくようお願いします。
株式会社 太陽デイリ-ファ-ム 様から
2020/10/09に以下の内容がデータベースに登録されました。
登録内容につきましては、届出した内容と相違ないかご確認願います。
[ 登録情報 ]
・報告の種類と登録した個体識別番号
[ 1件 ] 出生
個体識別番号 1628504352
生年月日 令和02年10月09日
雌雄の別 2:メス
母牛個体識別番号 0865359275
種別 3:交雑種(肉専用種×乳用種)
[ 0件 ] 転入
[ 0件 ] 転出
[ 0件 ] 死亡
[ 0件 ] 輸入
[ 0件 ] 耳標再発行
[ 0件 ] とさつ
[ 修正請求 ]
・修正・取消報告の種類と修正・取消した個体識別番号
[ 0件 ] 出生報告の修正
[ 0件 ] 異動報告の修正
[ 0件 ] 出生報告の取消
[ 0件 ] 異動報告の取消
このメールをデータ化してspreadsheetに登録するというのが、今回の日記の趣旨です。
先程のメールを・・・
こんな感じのデータにします。
プログラムは2本立て。
まず1本目はメールから識別センターのデータを取得します。
function getNLBCdata() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const mailData = ss.getSheetByName('メールデータ');
const readData = ss.getSheetByName('成形データ');
// メッセージを入れ、シートに書くには2次元配列にしないといけない
// その為空の配列を準備
let values = [];
// メール抽出の条件を設定
// let query = "subject:(牛個体識別台帳電算システム届出完了メール) label:[gmail]-識別センター after:2019/05/15 before:2019/06/20"//-->20190515まで使えるgmailクエリ
let query = "id@nlbc.go.jp インターネットからの届出受付が完了しました。 牛個体識別台帳電算システム届出完了メール after:2021/01/01 before:2021/12/31 "//--->20201016以降に使えるgmailクエリ
//条件にあうメールをスレッドとして取得
let threads = GmailApp.search(query);
// 各スレッド情報を取得
threads.forEach(function (thread) {
// スレッド内の全メッセージ取得
let messages = thread.getMessages();
messages.forEach(function (message) {
//送信日時を取得
let getTime = message.getDate();
// 本文取得(htmlとして)
let body = message.getBody();
// 得たメール情報valuesに入れる
values.push([getTime, body]);
});
mailData.getRange(2, 1, values.length, values[0].length).setValues(values);
});
}
次に取得したデータを見やすいデータに変換するプログラム。
と言っても、そのロジックをプログラムで組むのは自分には難しかったので、基本的にはSpreadsheet関数で生成します。
その方が関数の勉強にもなりますしね。
function bodyReMake() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const mailData = ss.getSheetByName('メールデータ');
const readData = ss.getSheetByName('成形データ');
const checkWordSheet = ss.getSheetByName('データ項目数');
const dataShapingSheet = ss.getSheetByName('データ処理シート');
const querySheet = ss.getSheetByName('絞り込みデータ');
const writeDataSheet = ss.getSheetByName('異動データ');
// 書き込み用変数
let wData = [];
// メール項目確認用配列取得
let checkWords = checkWordSheet.getRange("A1:B11").getValues();
// メールデータ取得
let mLastR = mailData.getLastRow();
let datas = mailData.getRange(2, 1, mLastR, 2).getValues();
// メールデータ頭の部分削除
let replaceWord1 = /インターネットからの届出受付が完了しました。[\s\S]*様から/;//20180303-の
// let replaceWord1 = /WEBでの報告受付が完了しました。[\s\S]*様から/;//~20180303の
let replaceWord2 = /登録内容につきましては、[\s\S]*・報告の種類と登録した個体識別番号/;
let replaceWord3 = /・修正・取消報告の種類と修正・取消した個体識別番号/;
// console.log(checkWords);
// 各メール毎について調べる
for (let i = 0; i < datas.length - 1; i++) {
let mailBody = datas[i][1];
console.log("メールチェック" + i + "番目");
// 余計な部分削除
mailBody = mailBody.replace(replaceWord1, "");
mailBody = mailBody.replace(replaceWord2, "");
mailBody = mailBody.replace(replaceWord3, "");
// メールデータを改行で1次元配列に
mailBody = mailBody.split("\r\n");
// 空白削除
mailBody = mailBody.filter(Boolean);
// --------ここから本文書き換え
// 日付データだけ日に
mailBody[0] = mailBody[0].replace("に以下の内容がデータベースに登録されました。", "");
console.log(mailBody[0]);
//データ成型シート(絞り込みデータシート)に書き込む
for (let j = 0; j < mailBody.length; j++) {
// console.log(mailBody[j]);
dataShapingSheet.getRange(j + 1, 1).setValue(mailBody[j]);
}
// 成形されたデータを取り込み、異動データシートへ転記
wData = querySheet.getRange(2, 2, querySheet.getLastRow() - 1, 4).getValues();
writeDataSheet.getRange(writeDataSheet.getLastRow() + 1, 1, wData.length, 4).setValues(wData);
// 成形用元データクリア
// dataShapingSheet.getRange("A1:A400").clear();
}
}
余計なコメントも入ってますが気にしないでください。
変換シートにはメール1通づつ、データが貼り付けられます。
貼り付けられたデータから最終的に欲しいデータの形を作ります。
動画では1列づつ表示してますが、もっとスマートに出来る方法あったと思います。あきれる程力業。400行迄対応してます。
データの間にコロン(:) を挟んでおきます。キーボードの「け」の所の記号です。これを挟むとによってエクセルで簡単に切り分け作業ができます。
最後に、GASでこの1通毎のデータを、記録用シートの末尾にどんどん追加していきます。
これを実際に動かしてみましょう。
これをトリガー設定して毎日動くようにすれば、常に新鮮なデータが取れるというわけです。
どうですか?
かなり可能性を感じさせてくれないでしょうか?
酪農関係のサイトにはこの様に情報をとれるサイトがいくつかあります。
今後も色々研究していいアイデアがあったら皆さんに紹介していこうと思います。
(浅野正慶)