💡

google formで発注システムを作ってみる

2023/04/10に公開

はじめに

嫁がケーキ販売を始めました。
そこで、誰から何を幾ついつまでにいるんだっけ?という話を耳にしました
なので、簡易でもいいので簡単なシステムを構築できないか?と思い行動した内容です

システム選定

要求仕様

求めすぎると作成に時間がかかるので、
・簡単にフォーム入力を行い、その履歴が確認できること
だけに絞ります。

システム選定

フォームを簡単に作るのであれば、色々なサービスが存在しますが、今回はgoogle formを利用しようと思います(これは、個人的興味からです)

概要や他の類似ツールはこちらに記載されています
https://kinsta.com/jp/blog/google-forms-alternative/

履歴に関しては、LINEに通知するようにしとけば履歴として確認できるので、今回はLINE通知を利用します

詳細機能

要求仕様から、最低限以下の通りで作成予定です

  1. フォームから入力できる
  2. 各注文にかぶらない(ユニーク)採番をしておきたい
  3. lineに入力値と合計金額を通知

入力フォームの作成

Google Formsの作成

紫いろのボタンから作成画面に移れます

注文なのでこんな感じに作成

Spreadsheetの連携

formsの回答タブの「スプレッドシートにリンク」から即連携ができます

スプレッドシートの名前に拘りがなければそのまま「作成」

これで連携完了です

Spreadsheetの連携の動作確認

注文フォームから登録し、スプレッドシートに記録されているか検証しときましょう。

ここから公開し、テストデータを入力

テストデータがスプレッドシートに記録されていれば、連携完了となります。

採番設定

このままだと区別するのが難しいので、採番を割り当てます
列を追加します(追加のやり方は割愛)

採番用のスクリプトを作成します

スクリプトは、こちらの記事を参考にしました
https://qiita.com/ta9star/items/5522177c2df07e6df477

function formsFunction() {
  var spreadsheet = SpreadsheetApp.openById('<id>');
  var sheet = spreadsheet.getSheets()[0];
  var range = sheet.getRange(sheet.getLastRow(),1);
  if(range.isBlank() == true){
    range.setValue("=ROW()-1");
  }
}

採番設定の動作確認

実行ボタンを押して、実行ログに「実行完了」となれば、とりあえずスクリプトとしては成功となります。

念のために、スプレッドシート側も確認して、追加した列に番号が入力されていれば成功となります

次にgoogle formsから入力された際に自動でスクリプトが連動するようにします。
左メニューからトリガーを選択し、「トリガーを追加」ボタンを押します

トリガーの発動タイミング(イベントの種類を選択)を「フォーム送信時」に変更し、「保存」ボタンで保存します

LINE Notifyと連携

①空のグループを作成

(皆さん使い慣れてると思いますので、説明は省略し画像のみです)


②LINE Notifyの連携先に①を登録

URLはこちらになります
https://notify-bot.line.me/ja/

ログイン後、マイページに飛びます

トークンを発行する際に、①で作ったグループを検索し、発行します
このトークンはどこかにメモしといてください

③LINEグループに、LINE Notifyを招待

(皆さん使い慣れてると思いますので、説明は省略し画像のみです)

google apps scriptを修正

採番するときに利用したスクリプトを修正します
こちらの記事を参考にしました
https://fullnoteblog.com/googleform-line/#toc8

function formsFunction() {
  var spreadsheet = SpreadsheetApp.openById('<id>');
  var sheet = spreadsheet.getSheets()[0];
  var row = sheet.getLastRow();
  var column = sheet.getLastColumn();
  var range = sheet.getDataRange();
  var message = "";

 for(var i=1;i<=column;i++){
    const item = range.getCell(1, i).getValue(); 
    if(item == "タイムスタンプ") continue; // タイムスタンプはスキップ

    // 採番のための処理
    var targetCell = range.getCell(row, i) 
    if (targetCell.isBlank() == true){
      targetCell.setValue("=ROW()-1");
    }

    message += "\n■" + item
    message += "\n    " + CreateCellValueToMessage(item , targetCell.getValue()); 
 }

  // Logger.log(message); 
  SendToLine(message);
}

function CreateCellValueToMessage(item , cellValue){
  const weekdayJp = ["日", "月", "火", "水", "木", "金", "土"];
  var changeCellValue = "";
  if ( item == "納入日") {
    date = new Date(cellValue);
    changeCellValue = Utilities.formatDate(date, 'JST', 'yyyy年M月d日');
    changeCellValue +='(' + weekdayJp[date.getDay()] + ')';
  } else {
    changeCellValue = cellValue;
  }
  return changeCellValue;
}

function SendToLine(message){
  var token = PropertiesService.getScriptProperties().getProperty('LINE_TOKEN');
  var op =
    {
      "method" : "post",
      "Content-Type" : "application/x-www-form-urlencoded",
      "payload": "message=" + message,
      "headers":{"Authorization" : "Bearer " + token}
    };
  var res = UrlFetchApp.fetch("https://notify-api.line.me/api/notify",op);
  Logger.log(JSON.parse(res.getContentText())); 
}

トークンの設定

プロジェクトの設定の一番下に「スクリプトプロパティ」があります

そこにトークンを設定し、保存します

LINEメッセージの動作確認

スクリプト部分から、実行ボタンを押すと下記のようにlineに通知が来れば、成功となります

あとは、LINEグループに関係者を呼んで、google formsのURLを伝える形で運用してみようと思います。

最後に

google formsは便利な半面、少し凝った使い方を使おうとしたら不便に感じました。
割り切った使い方をすれば便利に使えると思うので、使い所次第では有効だと思います。
今回は身内のみが利用する機能なので、これでよしとします。
身内で利用してみて、要望が出たら別記事を作成しようかと思います。

Discussion