【ゆるく始める】GAS在庫管理、自動メール送信とトリガー設定方法

ブルーカラー人生設計

この2点で作成しました。

在庫を持ち出す時に、QRコードでスプレッドシートを開いたあと、在庫数が一定数以下になると管理者に自動的にメールが行く仕組みをつくりました。

メールは翌朝8時に自動で送信されます。

  • 在庫の現在数が発注トリガー以下になれば、管理者にメールが配信される仕組み
  • 商品が納品されたらスプレッドシートに必要な処理がされる

GAS在庫管理、発注願い自動メール送信

GAS自動送信メール

スプレッドシート内の特定のセルの値をチェックし、条件が満たされた場合に管理者にメール通知を送信するスクリプトです。

また、セルの値を変更する処理も行います。

B2セルがD2セル以下になれば、管理者に納品のメールが送信される仕組みです。

こんな感じのメール

function checkAndNotify() {
  // スプレッドシートとシートを取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  
  // B2セルとE2セルの値を取得
  var b2Value = sheet.getRange("B2").getValue();
  var d2Value = sheet.getRange("D2").getValue();
  var c2Value = sheet.getRange("C2").getValue();
  var h2Value = sheet.getRange("H2").getValue();
  
  // B2セルの値がE2セルの値以下で、かつH2セルが「納品待ち」でないかをチェック
  if (b2Value <= d2Value && h2Value !== "納品待ち") {
    // F2セルの値を取得
    var f2Value = sheet.getRange("F2").getValue();
    
    // スプレッドシートのURLとファイルタイトルを取得
    var spreadsheetUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();
    var fileTitle = SpreadsheetApp.getActiveSpreadsheet().getName();
    
    // 管理者のメールアドレス
    var adminEmail = "lenonntobobu@gmail.com";  // ここに管理者のメールアドレスを入力
    
    // メール内容の作成
    var subject = "発注お願いします。";
    var body = "在庫がなくなりそうです。\n\n" +
               "商品名: " + fileTitle + "\n" +
               "発注定数: " + f2Value + c2Value + "\n" +
               "スプレッドシートのURL: " + spreadsheetUrl + "\n\n" +
               "発注されましたら、ステータスを納品待ちにしてください。";
    
    // メール送信
    GmailApp.sendEmail(adminEmail, subject, body);
    
    // H2セルの値を「納品待ち」に変更
    sheet.getRange("H2").setValue("納品待ち");
  }

1. checkAndNotify 関数の概要

  • 目的:
    1. スプレッドシートのセルの値をチェック。
    2. 条件が満たされている場合、管理者にメールを送信。
    3. メール送信後に特定のセルの値を「納品待ち」に変更。

2. スプレッドシートとシートの取得

現在アクティブなスプレッドシートとシートを取得します。


var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

3. セルの値の取得

B2、D2、C2、H2 の各セルの値を取得します。


var b2Value = sheet.getRange("B2").getValue();
var d2Value = sheet.getRange("D2").getValue();
var c2Value = sheet.getRange("C2").getValue();
var h2Value = sheet.getRange("H2").getValue();

4. 条件のチェック

以下の2つの条件が満たされているか確認します。

  1. B2セルの値がD2セルの値以下であること。
  2. H2セルの値が「納品待ち」ではないこと。
if (b2Value <= d2Value && h2Value !== "納品待ち") {

5. メール送信の準備

F2 セルの値、スプレッドシートの URL、ファイルのタイトルを取得します。

また、管理者のメールアドレスを指定します。


var f2Value = sheet.getRange("F2").getValue();
var SpreadsheetUrl = SpreadsheetApp.getActiveSpreadsheet().getUrl();
var fileTitle = SpreadsheetApp.getActiveSpreadsheet().getName();
var adminEmail = "”””””””"; // 管理者のメールアドレスを設定

6. メールコンテンツの作成

メールの件名と本文を作成します。

var subject = "発注お願いします。"; var body = "在庫がなくなります。\n\n" + "商品名: " + fileTitle + "\n" + "発注確定数: " + f2Value + c2Value + "\n" + "スプレッドシートのURL: " + SpreadsheetUrl + "\n\n" + "発注されましたら、納期を待ってください。";

7. メールの送信

  • 目的: Gmailを使って、作成したメールコンテンツを管理者に送信します。
    GmailApp.sendEmail(adminEmail, subject, body);

8. セルの値の変更

  • 目的: メールを送信した後、H2セルの値を「納品待ち」に変更します。
    sheet.getRange("H2").setValue("納品待ち");

まとめ

  1. スクリプトはまず、スプレッドシートの指定されたセルの値を取得します。
  2. 条件が満たされると、管理者にメール通知を送信します。このメールには商品名や発注確定数、スプレッドシートのURLなどが含まれます。
  3. メール送信後、スクリプトはH2セルの値を「納品待ち」に変更します。

条件が満たされると自動的にメールが送信されるので、人的なミスを減らし、迅速な対応が可能になります。

在庫管理、納品後の処理

GAS自動シート作成

このスクリプトは、ユーザーの承認を得た後に、「オリジナル」という名前のシートから特定のデータを新しいシートにコピーし、元のシートのデータを消去するためのものです。

新しいシートの名前は、スクリプトが実行された日付になります。

function createSheetWithTodayDate() {
  var ui = SpreadsheetApp.getUi();
  var response = ui.alert('処理後、I2セルの納品後数を更新してください', ui.ButtonSet.YES_NO);
  
  if (response == ui.Button.YES) {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var originalSheet = spreadsheet.getSheetByName('原本');

    if (!originalSheet) {
      ui.alert('原本シートが見つかりません。');
      return;
    }

    // Log the value of B2 before setting it to I4
    var B2cell = originalSheet.getRange(2, 2).getValue();
    Logger.log('Value in B2: ' + B2cell);
    
    // Clear I4 and set its value to B2's value
    originalSheet.getRange("I4").clearContent();
    originalSheet.getRange("I4").setValue(B2cell);
    
    var today = new Date();
    var formattedDate = Utilities.formatDate(today, Session.getScriptTimeZone(), 'yyyy-MM-dd');
    
    var sheets = spreadsheet.getSheets();
    var sheetExists = sheets.some(function(sheet) {
      return sheet.getName() === formattedDate;
    });
    
    if (sheetExists) {
      ui.alert('シート「' + formattedDate + '」は既に存在します。');
    } else {
      var newSheet = spreadsheet.insertSheet(formattedDate);
      var lastRow = originalSheet.getRange('B:B').getLastRow();
      if (lastRow >= 5) {
        var rangeToCopy = originalSheet.getRange(5, 1, lastRow - 4, 3);
        var dataToCopy = rangeToCopy.getValues();
        
        newSheet.getRange(1, 1, dataToCopy.length, dataToCopy[0].length).setValues(dataToCopy);
        rangeToCopy.clearContent();
        originalSheet.getRange("H2").clearContent();
        
        Logger.log('Created sheet with name: ' + newSheet.getName());
        ui.alert('シート「' + newSheet.getName() + '」にデータをコピーし、原本の該当範囲の文字列を消去しました。');
      } else {
        ui.alert('5行目以降にコピーするデータがありません。');
      }
    }
  } else {
    ui.alert('処理は中止されました。');
  }
}

1. createSheetWithTodayDate 関数の概要

  • 目的: この関数は、以下の処理を行います。
    1. ユーザーに対して、処理後に特定のセル(I2)の更新を促すメッセージを表示。
    2. ユーザーが「YES」を選択した場合に処理を進める。
    3. 「原本」という名前のシートから特定のデータを取得し、新しいシートを作成してデータをコピー。
    4. コピー元のセルの内容をクリア。

2. ui.alert 関数

  • 目的: ユーザーインターフェース(UI)にメッセージを表示し、ユーザーに「YES」または「NO」の選択をさせる。
    var response = ui.alert('処理後、I2セルの納品後数を更新してください', ui.ButtonSet.YES_NO);

3. シートの取得

  • 目的: 現在アクティブなスプレッドシートと「原本」という名前のシートを取得する。
    var スプレッドシート = SpreadsheetApp.getActiveSpreadsheet(); var originalSheet = spreadsheet.getSheetByName('原本');
  • エラーハンドリング: 「原本」シートが見つからない場合、エラーメッセージを表示して処理を終了。
    if (!originalSheet) { ui.alert('原本シートが見つかりません。'); return; }

4. データの取得と設定

  • 目的: 「原本」シートの B2 セルの値をログに記録し、それを I4 セルに設定する。設定前に I4 セルをクリア。
    var B2cell = originalSheet.getRange(2, 2).getValue(); Logger.log('B2 の値: ' + B2cell); originalSheet.getRange("I4").clearContent(); originalSheet.getRange("I4").setValue(B2cell);

5. 新しいシートの作成

  • 目的: 今日の日付をフォーマットし、それを名前とする新しいシートを作成する。既に同名のシートが存在する場合、警告を表示して処理を終了。
    var today = new Date(); var formattedDate = Utilities.formatDate(today,Session.getScriptTimeZone(), 'yyyy-MM-dd');
    var sheets = spreadsheet.getSheets(); var sheetExists = sheets.some(function(sheet) { return sheet.getName() === formattedDate; }); if (sheetExists) { ui.alert('シート「' + formattedDate + '」は既に存在しています。'); } else { var newSheet = spreadsheet.insertSheet(formattedDate);

6. データのコピーとクリア

  • 目的: 「原本」シートの B 列から 5 行目以降のデータを新しいシートにコピーし、元のデータをクリア。コピー対象のデータがない場合、警告を表示。
    var lastRow = originalSheet.getRange('B:B').getLastRow(); if (lastRow >= 5) {
    var rangeToCopy = originalSheet.getRange(5, 1, lastRow - 4, 3);
    var dataToCopy = rangeToCopy.getValues();
    newSheet.getRange(1, 1, dataToCopy.length, dataToCopy[0].length).setValues(dataToCopy);
    rangeToCopy.clearContent(); originalSheet.getRange("H2").clearContent();
    Logger.log('次の名前のシートが作成されました: ' + newSheet.getName());
    ui.alert('シート「' + newSheet.getName() + '」にデータをコピーし、元の該当範囲の内容を消去しました。'); } else { ui.alert('5行目以降にコピーするデータはありません。'); }

7. ユーザーの選択による処理中止

  • 目的: ユーザーが「NO」を選択した場合、処理を中止する。

トリガー設定方法

Google Apps Script (GAS) のトリガーを設定して、毎朝8時に特定の関数が自動的に実行されるようにする方法を解説します。

1. Google Apps Script エディタを開く

まず、Google スプレッドシートや Google ドキュメントから、Google Apps Script エディタを開きます。

  1. スプレッドシートの場合、メニューの「拡張機能」から「Apps Script」を選択します。

2. トリガーを設定する

次に、トリガーを設定します。

方法 1: スクリプトエディタから設定する方法

  1. スクリプトエディタの上部メニューから、「時計のアイコン」をクリックします。
    • もしくは、「トリガー」タブをクリックします。
  2. 「トリガー」ページが開いたら、「トリガーを追加」をクリックします。
  3. 「関数を選択」で、実行したい関数名を選びます(例: checkAndNotify)。
  4. 「イベントのソースを選択」ドロップダウンメニューから「時間主導型」を選択します。
  5. 「時間ベースのトリガータイプを選択」のドロップダウンで「日付ベースのタイマー」を選びます。
  6. 「時刻の間隔を選択」ドロップダウンで、「特定の時間」を選択します。
  7. 「時間を選択」のドロップダウンで「午前8時から9時」を選択します。
  8. 「分を選択」で、「0分」などを選びます。
  9. 最後に、「保存」をクリックしてトリガーを設定します。

方法 2: コードで設定する方法

コードを使ってもトリガーを設定できます。以下のコードをスクリプトに追加してください。

javascriptコードをコピーするfunction createTimeDrivenTrigger() {
  // 既存のトリガーを削除してから新しいトリガーを作成
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }

  // 毎朝8時に実行するトリガーを設定
  ScriptApp.newTrigger('checkAndNotify')  // 実行する関数名を指定
           .timeBased()
           .atHour(8)
           .everyDays(1)
           .create();
}

この関数 createTimeDrivenTrigger を一度実行すると、checkAndNotify 関数が毎朝8時に自動的に実行されるトリガーが設定されます。

3. トリガーの確認と管理

設定したトリガーは、スクリプトエディタの「トリガー」ページからいつでも確認・編集・削除できます。

補足

  • トリガー設定が正しく動作しているかどうかを確認するために、エラーが発生した場合の通知設定を行うこともできます。
  • トリガーが正しく動作しない場合、エラーログを確認して原因を調査できます。

これで、毎朝8時に自動的に特定の関数が実行されるようになります。

まとめ

今回コードを書く時に使用したAIツールはPerplexity AIです。

かなり便利で多用しています。

GASはちょっと勉強すれば、AIと組み合わせて現場で使えるようになります。

プログラミングしたいと思っている人におすすめの方法です。

コメント