あいさつ
はじめまして、onm.という者です。(twitter→@loxopr)
プログラム経験的には学生時代に授業で少し学んだぐらいです。(工業機械系です
お仕事は違うことをやっています。
なのでデタラメを書いてることが多いと思いますが、その時は教えてください。。。お願いします。
勉強します。
今回やりたいこと
仕事で消耗品を使う機会が結構多いです。なので在庫管理表を作成します。
今回は録音業務で使用するCD-Rの在庫表を作成します。
しかし、在庫管理表なんかをExcelで作成して手書きでも良いのでしょうけど、
現場上あまり好まれません。紙どっかいっちゃうこと多いし。
なので覚えたてのGoogle Apps Scriptで作っちゃえーっていう。感じです。
すみません適当です。
作業的には
LINE Message APIでBOTを作成、作ったLINE BOTにメッセージ送ることによってスプレッドシートに書き込み。
在庫も知りたいので特定のメッセージに反応して在庫の数を返す。です。
GoogleAppsScript
主にGoogleAppsScript使います。導入は割愛。
Google Apps Script入門
アイデアを記録・想起する LINE Bot を作ってみました。
今回参考にした記事です。ソースはほぼコピペしました。すみません。
コード
var CHANNEL_ACCESS_TOKEN = "アクセストークン"; // LINE BOTのアクセストークン
var line_endpoint = 'https://api.line.me/v2/bot/message/reply';
function createSpreadSheet(sh) {
var spreadSheet = SpreadsheetApp.openById('記入するスプレッドシートのID');
var sheet = spreadSheet.getSheets()[0];
sheet.appendRow(['日時', '使用枚数']);
PropertiesService.getScriptProperties().setProperty(sh,spreadSheet.getId());
var file = DriveApp.getFileById(spreadSheet.getId());
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
sheet.setColumnWidth(1, 150);
sheet.setColumnWidth(2, 65);
return spreadSheet;
}
function getSpreadSheet(sh) {
var sid = PropertiesService.getScriptProperties().getProperty(sh);
if (sid == null) {
return createSpreadSheet(sh);
} else {
try {
return SpreadsheetApp.openById(sid);
} catch(e) {
return createSpreadSheet(sh);
}
}
}
function addToSpreadSheet(sh, message) {
var today = new Date();
var spreadSheet = SpreadsheetApp.openById('スプレッドシートのID');
var sheet = spreadSheet.getSheets()[0];
sheet.appendRow([today, message]);
}
function doPost(e) {
var json = JSON.parse(e.postData.contents);
var reply_token= json.events[0].replyToken;
if (typeof reply_token === 'undefined') {
return;
}
var sh = json.events[0].source.user;
var user_message = json.events[0].message.text;
var reply_messages;
var spreadSheet;
if ('ヘルプ' == user_message) {
reply_messages = ["CD-Rの使用枚数を数字で記入してください。 \在庫を追加したい場合は-数量で入力してください\n\n在庫を知りたい場合は【在庫】と入力してください"];
} else if ('スプレッドシート' == user_message) {
spreadSheet = getSpreadSheet(sh);
reply_messages = [spreadSheet.getUrl()];
} else if (typeof user_message === 'undefined') {
reply_messages = ["ゴメンナサイ、文字以外の情報には対応していません。\n\n使い方が知りたいときは「ヘルプ」と入力してみてください。"];
}
else if ('在庫' == user_message) {
spreadSheet = getSpreadSheet(sh);
var zaiko =[];
var sheet = spreadSheet.getSheets()[0];
var zaiko = sheet.getRange("G2").getValue();
reply_messages = [zaiko];
}
else {
addToSpreadSheet(sh, user_message);
reply_messages = ['更新されました'];
}
var messages = reply_messages.map(function (v) {
return {'type': 'text', 'text': v};
});
UrlFetchApp.fetch(line_endpoint, {
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
},
'method': 'post',
'payload': JSON.stringify({
'replyToken': reply_token,
'messages': messages,
}),
});
return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
まとめ
GASをウェブアプリケーションとして公開して、
でてきたURLをLINEBOTのWebhookに指定しておしまい。
これで、作ったLINE BOTに対して数字を送信すればスプレッドシートに数字が記入されます。(日付と時間も
減算方法はスプレッドシートの方で関数を組んでいます。原始的です。何かもっといい方法があるのかな。
在庫 と送信した場合にはスプレッドシートのセルの値を取得して表示しています(取得先はG2としています
これでライングループに他の作業員の方々を入れて、
そこにBOTをいれておけばCD-Rの使用後にメッセージを送るだけで、在庫管理ができますね!
今後やりたいこと
在庫がある一定の値より少なくなった場合に、そろそろ買ってね!て通知する
在庫追加したよ!っていうのを別の場所に記す。日付も。
数字以外の文字を入れたらエラーを返す。
在庫がCD-Rのみのものになっているので、
LINEで送信する数字の接頭に、名目を入れれば名目別のシートに記入される!
この辺りを今後実装できたらなーっていう妄想はしています。
まだ実務には導入できそうもないけど
最近気になること
最近、Google homeやNatureRemoを手に入れまして遊んでおります。
もっと拡張的なことやるには何ができるかなー。と調べていたところQiitaを見つけました。
とても便利そうなので、自分も覚書程度に記していこうと思います。
同じことをやっている方が多いのでとても参考にしてます。よろしくお願いします。