googleスプレッドシートを利用した注文ノート

ラボの試薬等の注文ノート、かつては手書きで管理していたが、注文漏れがあったり、それによって困ったりケンカがおこったりしてたりしたので、電子化した。googleスプレッドシートは、メールを送信してくれるので注文漏れがあってもリマインドしてくれるようにもできる。入力するたびに送信すると、一件入力するごとに送信されてしまうので、タイムリーさは若干損なわれるものの、2時間ごとに変更点を確認し、送信する仕様にした。

注文があると以下のようなメールがきます(基本は自分宛てを想定)。

xx 様
注文ノートの更新がありました。1件の注文です。URLをご確認いただきますようお願いします。
https://docs.google.com/spreadsheets/xxxx(設定したURL。ソースコードに記入)

さま、
いつもお世話になっております。以下の発注をいたします。よろしくお願いいたします。

注文者,商品名,カタログNO.,メーカー名,単価,数量
xx,NucleoBond® Xtra Midi,U0410A,takara,10150,1

これをコピペして業者さんに送れば手間を省ける、という算段。

日をまたいで未発注があれば、夜明けにリマインダーがきます。

【つくりかた】

以下のようなスプレッドシートをgoogleドキュメントで作り、

右クリックで画像を新しいタブで表示、で大きくなります。六行目以降は延々と596個の注文が書いてあります。1-4行目、このように記載。

Excelのシートにした物はこちら。コピペの材料にどうぞ。

ちょっと下に示したソースコードのようにスクリプトを作成(メニュー:ツール-スクリプトエディタ)

トリガーを忘れずに設定(GASのトリガー設定の仕方は多くのページで紹介されているのでググってください 例:https://tonari-it.com/gas-timed-driven-trigger/

 function hourlyFunc():2時間に一回実行するように設定。

 function DailyReminder():毎日夜中に実行。ただし、土曜・日曜の未明に来ても迷惑なので、月~金の未明の5回を独立に設定。

 function onOpen():開いたときにトリガーさせる。

 

以下はソースコード。ご自由にご利用ください。赤字のところだけなおせばいいはずです。まずは自分のアドレスでテストしてみてください。

//(C) 2018, Created by Shinji Kanda
/*hourlyFuncは、一定時間ごとに、新規注文があるかどうかを時限実行する関数。
DailyReminderは、毎日夜中に注文漏れがないかどうか確認する関数*/

function hourlyFunc() {
  
  SpreadsheetApp.getActiveSheet()
    .getRange('A1') //挿入したいセル
    .setValue(
      '最終更新: ' + Utilities.formatDate(new Date(), 'JST', 'yyyy年MM月dd日HH時mm分')) //日時フォーマット
 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  //2. 現在のシートを取得
  var sheet = spreadsheet.getActiveSheet();
  var rangeF2 = sheet.getRange("F2");
  var valueF2 = rangeF2.getValue();
  var rangeF3 = sheet.getRange("F3");
  var valueF3 = rangeF3.getValue();
  var valueOrder = valueF2-valueF3; //ここまででこれまでの送信件数と、現在の入力件数を取得、引き算。あと何件発注の必要があるか計算
  if (valueF2 > valueF3)
  {    
/* 各データを準備 */
  var strTo="送信先メールアドレス。複数の場合は,で区切る"; //To
  var strName="xx様"; //送信先名前
  var strFrom="googleアカウントのアドレス"; //From
  var strSender="差出人名"; //差出人
  var spreadURL="https://docs.google.com/spreadsheets/~~自分のURLをいれる"; //スプレッドシートのURL(メール本文で参照させる)
  /* メール本文を準備 */
  var strSubject="注文がありました。ご確認ください。";
  var strBody= "\n" +  strName + " 様\n" + "注文ノートの更新がありました。" + valueOrder + "件の注文です。URLをご確認いただきますようお願いします。\n" +spreadURL + "\n\n\n\n\nさま、\nいつもお世話になっております。以下の発注をいたします。よろしくお願いいたします。\n";
    var rangeName =sheet.getRange (4,2,1,6); 
    var valueName = rangeName.getValues();
    strBody = strBody + "\n\n" + valueName + "\n";
    for (var number=1; valueOrder >= number; number++)
    {
    var rangeName =sheet.getRange (valueF2 + 5 - number,2,1,6);
    var valueName = rangeName.getValues();
      strBody = strBody  + valueName + "\n";
    }    
  /* メールを送信 */
  GmailApp.sendEmail(
    strTo,
    strSubject,
    strBody,
    {
      from: strFrom,
      name: strSender
    }
  ); //MailAppではfromが設定できないとのこと
 
/*    SpreadsheetApp.getActiveSheet()
    .getRange('C1') //挿入したいセル
    .setValue(
      '送信済み') //日時フォーマット
*/
SpreadsheetApp.getActiveSheet()
    .getRange('F3') //挿入したいセル
    .setValue(valueF2) //現在注文総数を前回送信時個数にいれる
  }
}


function DailyReminder()
{
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var rangeH2 = sheet.getRange("H2");
  var valueH2 = rangeH2.getValue();
  var rangeF3 = sheet.getRange("F3");
  var valueF3 = rangeF3.getValue();
    if (valueF3 > valueH2)
  {    
/* 各データを準備 */
  var strTo="送信先メールアドレス。複数の場合は,で区切る"; //To
  var strName="xx様、"; //送信先名
  var strFrom="googleアカウントのアドレス"; //From
  var strSender="注文ノート"; //差出人
  var spreadURL="https://docs.google.com/spreadsheets~~実際のURL"; 
  /* メール本文を準備 */
  var strSubject="【リマインダー】未発注の注文があります。ご確認ください。";
  var strBody= "\n" +  strName + " 様\n" + "未発注のものがあるようです。\n手違いなら申し訳ありませんがURLをご確認いただきますようお願いします。\n" +spreadURL;
 
  /* メールを送信 */
  GmailApp.sendEmail(
    strTo,
    strSubject,
    strBody,
    {
      from: strFrom,
      name: strSender
    }
  ); //MailAppではfromが設定できないとのこと
  }}

  function onOpen() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //開いたときにカーソルを一番下にもっていく
  SpreadsheetApp.getActiveSheet().setActiveSelection("A" + sheet.getLastRow()); 
}