LINEmessagingAPIとGoogleAppsScriptを使って在庫管理をする。

#あいさつ
はじめまして、onm.という者です。(twitter→[@loxopr](http://twitter.com/loxopr?lang=ja))
プログラム経験的には学生時代に授業で少し学んだぐらいです。（工業機械系です
お仕事は違うことをやっています。
なのでデタラメを書いてることが多いと思いますが、その時は教えてください。。。お願いします。
勉強します。


#今回やりたいこと
仕事で消耗品を使う機会が結構多いです。なので在庫管理表を作成します。
今回は録音業務で使用するCD-Rの在庫表を作成します。

しかし、在庫管理表なんかをExcelで作成して手書きでも良いのでしょうけど、
現場上あまり好まれません。紙どっかいっちゃうこと多いし。
なので覚えたてのGoogle Apps Scriptで作っちゃえーっていう。感じです。
すみません適当です。

作業的には
LINE Message APIでBOTを作成、作ったLINE BOTにメッセージ送ることによってスプレッドシートに書き込み。
在庫も知りたいので特定のメッセージに反応して在庫の数を返す。です。

#GoogleAppsScript
主にGoogleAppsScript使います。導入は割愛。


[Google Apps Script入門](http://uxmilk.jp/25841)
[アイデアを記録・想起する LINE Bot を作ってみました。](http://takagusu.hateblo.jp/entry/2017/02/26/010710)
今回参考にした記事です。ソースはほぼコピペしました。すみません。

#コード

```GAS:code.gs
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を見つけました。
とても便利そうなので、自分も覚書程度に記していこうと思います。
同じことをやっている方が多いのでとても参考にしてます。よろしくお願いします。