毎日指定の時刻に、スプレッドシートの内容をCSV化して指定のメールアドレス宛に自動でメール送信する方法【tips-002】

Kikantree のディレクター鈴木です。

 

ECサイトの運営効率化の後編になりますが、今回は倉庫への発送指示を自動化した事例について紹介します。

(この記事はECサイトの運営効率化の続きになります)

→前編はこちら

 

 

この記事をご覧になっている方は、スプレッドシートの内容をCSV化して、指定のメールアドレス宛に自動でメールを送りたいと考えているのではないでしょうか?

 

私の知人も、同様のことを思っていたようです。

 

結論から伝えると、こちらもGoogleAppsScriptを使えば実現が可能です。

 

私の知人の場合、倉庫への発送指示は平日(営業日)には必ずおこなっている業務になります。

(倉庫は発送指示がないと勝手に動くことはできないため、発送指示は必ず必要

 

倉庫には発送指示の受付締切時刻があり、締切時刻を過ぎると倉庫からの発送が翌日(翌営業日)になってしまうため、毎日必然とタイムリミットに迫られていました。

 

そこで、スプレッドシートに入力されている情報を自動的にCSV化して指定のメールアドレスへメール送信する仕組みを作って運用してみたところ、想像以上に運用が楽になったとの感想をいただいたので、今回実施した内容を紹介いたします。

 

ちなみに、今回の仕組みに必要なものは以下になります。
・Googleアカウント
・Googleカレンダー
・Gmail
・スプレッドシート
・GoogleAppsScript ※以下に記載

 

お時間の無い方は、スクリプトをコピペしていただければ動作するかと思いますので、ご自由にご利用ください。

 

それでは、見ていきましょう。

 

<1> 実現したいことの整理と準備

前回と同様に、まず最初に、今回のケースで実現したいことを整理します。
今回は下記のようになると思います。

 

①スプレッドシートを用意する

 

サンプルシート(注文管理用のスプレッドシートのサンプルです)

https://docs.google.com/spreadsheets/d/1MwxHqw9P-jlkAcDqwDPjatfwr8utT6XSdz8nneFdDsU/edit?usp=sharing

 

②時刻を判定し、特定の時刻になったら平日かどうかを判定する
平日であれば、その日の日付のシートを作成する

③シートの内容をCSV化して、Googleドライブに保存する

④指定のメールアドレス宛にCSVファイルを添付してメール送信する

 

 

<2> <1>で書いた流れをプログラムに書き起こしていく

 

あとは、流れに沿ってプログラムを書き起こしていくだけです。

最初に、実際に動くサンプルを掲載しますので、時間のない方はご自身の環境にコピペしてご利用ください。

一部、ご自身の環境に合わせて変更が必要な箇所があります。

前回同様、最初のGAS実行時には権限承認が必要になりますので、ご注意ください。

 

/****************************************************************
    今日の日付を取得する
****************************************************************/

var now = new Date();


/****************************************************************
    現在の時刻を取得し、
  13時30分  → スプレッドシートをCSV化してメール送信(土日祝日はメール送信しない)
****************************************************************/

function judgeTime () {

    var today_hour = now.getHours() //今の時刻のうち、時を取得
    var today_minute = now.getMinutes() //今の時刻のうち、分を取得

    /* 今が13時30分 */
    if(today_hour == 13 && today_minute == 30) {

        /* 土日祝日を判定する */
        //曜日判定の初期値
        var holiDay = now.getDay();
            console.log(holiDay);
        //祝日判定の初期値
        var cal = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
        var holidays = cal.getEventsForDay(now);
            Logger.log(holidays.length);

        // 土日祝日のいづれかなら処理を終了
        if(holiDay == 0 || holiDay == 6 || holidays.length == 1) {
            console.log("メール送信なし")
            return false;
        }
        // 土日祝日以外なら処理を実行
        else {
            outputCsv() //CSVを保存する関数、54行目以下で定義している
            sendMailfunc() //メールを送信する関数、110行目以下で定義している
        }
    }
    /* 今が13時30分以外 */
    else {
        console.log("動作なし")
        return false;
    }
}

/****************************************************************
    スプレッドシートの内容をCSVに変換し、Googleドライブに保存する
****************************************************************/

function outputCsv() {

    // 現在アクティブなスプレッドシートを取得
    var activeSpreadSheetNow = SpreadsheetApp.getActiveSpreadsheet();
    // そのスプレッドシートにある最初のシートを取得
    var activeSpreadSheetNowNow = activeSpreadSheetNow.getSheets()[0]; //複数のシートがある場合は任意のシート位置に合わせて使用するといい

    // そのシートのシート名を取得して変数に格納
    var activeSpreadSheetNowNowName = activeSpreadSheetNowNow.getSheetName();

    var sheetNameToCsv = activeSpreadSheetNowNowName; //CSVファイルにするシート名を指定

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheetOutput = ss.getSheetByName(sheetNameToCsv);

    var sheetOutputString = sheetOutput.getDataRange().setNumberFormat("@"); //データを書式なしテキストに変換

    var values = sheetOutputString.getValues(); //データ範囲を二次元配列で取得
    // Logger.log(values);

    var csv = values.join('\n');
    // Logger.log(csv);

    //-------------------------------------------------------
    // CSVの文字コードをShift-Jisに変換する ※Excelで開けるように
    //-------------------------------------------------------
    // Underscoreライブラリを宣言 ※ライブラリを追加必要
    var _ = Underscore.load();

    var lineDelimiter = ",";
    var newLineChar = "\r\n";

    // 2次元配列になっているデータをcsvのstringに変換
    var csvString = _.map(
    values,
    function(row){return row.join(lineDelimiter);}
    ).join(newLineChar);

    var charSet = "Shift_JIS";
    var blob = Utilities.newBlob(csv, MimeType.CSV, activeSpreadSheetNowNowName + '.csv').setDataFromString(csvString, charSet);
    // var blob = Utilities.newBlob(csv, MimeType.CSV, activeSpreadSheetNowNowName + '.csv'); //utf-8の場合はこちらを有効にする

    // Googleドライブへ保存する
    var id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; //ご自身のGoogleドライブ上のフォルダID
    var folder = DriveApp.getFolderById(id);

    //CSVファイルを作成
    folder.createFile(blob);

}

/****************************************************************
    13時30分のメール送信処理
****************************************************************/
function sendMailfunc(){

    //メール送信処理

    // 現在アクティブなスプレッドシートを取得
    var activeSpreadSheetNow = SpreadsheetApp.getActiveSpreadsheet();
    // そのスプレッドシートにある最初のシートを取得
    var ss = activeSpreadSheetNow.getSheets()[0];
    var ss = ss.activate(); //先頭の位置にあるシートをアクティブ化

    var ssName = ss.getSheetName();
    console.log(ssName)

    var maxColumn = ss.getLastColumn();
    var maxRow = ss.getLastRow();
    console.log(maxRow)

    if (maxRow == 1) {
        console.log("メール送信なし");
    }
    else {
        var data = ss.getRange(1,1,maxRow,maxColumn).getValues();

        if (data.length > 0) {
        var csv = "";
        for (var row = 0; row < data.length; row++) {
            for (var col = 0; col < data[row].length; col++) {
                if (data[row][col].toString().indexOf(",") != -1) {
                    data[row][col] = "\"" + data[row][col] + "\"";
                }
            }

            if (row < data.length-1) {
                csv += data[row].join(",") + "\r\n";
            }
            else {
                csv += data[row];
            }
        }
        csvFile = csv;
    }

    var blob = Utilities.newBlob("", 'text/comma-separated-values', ssName + '.csv');
    blob.setDataFromString(csvFile, "Shift_JIS");
    var options = {attachments:[blob]};
    // MailApp.sendEmail("送信先メールアドレス", "メールタイトル", "メール本文", options);
    MailApp.sendEmail(
    "example1@example.com, example2@example.com", // メール宛先
    "◯◯◯◯◯◯◯です", // メール件名
    "◯◯◯様\n\n本日分の発注を送ります。\n\n", // メール本文
    options);

    }

}

 

<3> スクリプトの中の一部を解説します

 

・スプレッドシートを用意する

これは特にプログラムを書くことはありませんが、GASを実行する対象のスプレッドシートを特定する必要があるため、その記述だけ必要になります。

 

・毎日、決まった時刻(今回のサンプルでは13時30分)になったらスプレッドシートの内容を自動でCSVに変換してGoogleドライブへ保存し、ファイル名は当日の日付(yyyy/mm/dd)にする

CSVファイルの文字コードを変換する際に、既存のライブラリを追加が必要になります。

 

 

<Underscoreライブラリ追加の方法>

左メニュー > ライブラリ の+ボタンをクリックし、Underscoreライブラリを追加します。
スクリプトID入力のポップアップが表示されるので、以下のIDを入力して検索して追加しておきます。




プロジェクトキー:1PcEHcGVC1njZd8SfXtmgQk19djwVd2GrrW1gd7U5hNk033tzi6IUvIAV

ライブラリのメニュー下に「Underscore」が表示されれば無事に追加が完了です。

 

 

・Googleドライブへ保存したCSVファイルを添付して指定のメールアドレス宛にメール送信する

 

これは「MailApp.sendEmail()」を使えば簡単に実現可能です。

 

 

<4> GASのトリガーを設定しておく

 

毎日、指定の時刻に関数を実行する必要があるため、そういうときにはGASのトリガーを使用します。

デフォルトのトリガーでは、時刻の指定まではできないため、1分おきに関数を実行するトリガーを設定して時刻を判定します。

※24時間365日、毎分おきに関数を自動実行されますが、サーバー料金は基本無料です。本当にありがたいですね。

 

<5> まとめ

 

毎日、決まったことを必ずやる必要がある業務というのはけっこうよくあることだと思います。

そういった部分だけでも自動化することで、本来人間が時間を使うべき仕事や業務に多くの時間を割けるようにできれば業務効率が向上し、会社の売上げアップにつながるのではないかと思っています。

とくに小規模の会社や団体においてはシステムに予算を多くかけることも難しいと思われるため、こういった工夫をすることで業務効率化をしていけるといいのではないかと思います。

 

この記事がお役に立ちましたら幸いです。

 

 

 

スプレッドシートやGASではカバーしきれなくなってきた時は、専用の業務システムを作るほうが効率的です。kikantreeは中小企業向けの業務システムパッケージのため、ある程度コストも抑えつつ、必要な機能だけを使うことができます。ぜひお気軽にお問い合わせください!
https://kikantree.jp

 

 

 

この記事が良かったら共有してください。