GASでファイル添付・メール送信も自動化できる!

Gmailでファイルを添付して何かを送る、ということは多いですよね。

今回は、「Google Driveにあるファイルを添付して、Gmailで送信する」

というGASを作ってみました。

(具体例として、「インボイスの登録番号通知書とWordファイルを

複数の宛先に送る」プログラムを作りました)

※GASはルーティンの味方

 

ファイル添付・メール送信自動化の手順

①Google Driveに送りたいファイルを保存し、アドレスをコピーする

宛先ごとにGoogle Driveにフォルダを作り、送りたいファイルを保存します。

 

このとき、Driveのフォルダアドレスをコピーしておきます。

 

②スプレッドシートにメールの情報を入力する

スプレッドシートにGmailのTo, Cc, Bcc, 件名、本文、Google Driveのフォルダのアドレス(先ほどコピーしたものを貼付)

などメールの情報を入力します。

一番左のステータスは、下書きのままにしたいものは下書き、送信したいものは送信を入力します。

ここから情報をとり、メールを送ることになります。

 

③Apps Scriptを起動する

拡張機能→Apps Scriptを起動します。

 

④GASを書く

Apps Scriptが開いたら、いよいよGASを書いていきます!

今回は、以下の流れをイメージして作ります。

なお、全部いきなり送信だと困ることも多いと思うので

  • 「ステータスが下書きだったら下書き状態にする」
  • 「ステータスが送信だったら送信する」
  • 「ステータスが下書き、送信以外だったらなにもしない」

に条件分けします。

こちらで作ったコードは以下のとおりです。

function Gmailsend() {

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

  var rows = sheet.getLastRow()-1; //先頭の行を除く
  var columns = sheet.getLastColumn();

  var range = sheet.getRange(2,1,rows,columns);
  var datas = range.getValues();

  datas.forEach(function(data){

    var status = data[0];
    var receipant = data[1];
    var cc = data[2];
    var bcc = data[3]; 
    var subject = data[4];
    var body = data[5];
    var DriveUrl = data[6];


    var attachments = []; //添付ファイルの空の配列を作る


    if(DriveUrl !==""){
      var id = DriveUrl.replace("https://drive.google.com/drive/u/0/folders/","");
      var folder = DriveApp.getFolderById(id);
      var files = folder.getFiles();
      while(files.hasNext()) {
        var file = files.next();
        attachments.push(file); 
      }
    }

    var options = {
      cc:cc,
      bcc:bcc,
      attachments:attachments,
  } 

  if(status === "下書き"){
    GmailApp.createDraft(receipant, subject, body, options);

  }else if(status === "送信"){
    GmailApp.sendEmail(receipant, subject, body, options); 
  }
  });
}

 

解説を加えます!

■スプレッドシートから情報を読み取る

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

  var rows = sheet.getLastRow()-1; //先頭の行を除く
  var columns = sheet.getLastColumn();

  var range = sheet.getRange(2,1,rows,columns);
  var datas = range.getValues();

  datas.forEach(function(data){

    var status = data[0];
    var receipant = data[1];
    var cc = data[2];
    var bcc = data[3]; 
    var subject = data[4];
    var body = data[5];
    var DriveUrl = data[6];

以上の部分は、スプレッドシートから情報を読み取っています。

最初の2行はスプレッドシートを使う時に必ず必要となる部分ですので、

覚えてしまって良いと思います。

 

4行目の

var rows = sheet.getLastRow()-1; //先頭の行を除く

は、データが入っているセルの最終行を取得しています。

先頭行を除きたいので、-1をしています。

 

5行目の

varcolumns = sheet.getLastColumn();

はデータが入っているセルの最終列を取得しています。

 

7行目の

var range = sheet.getRange(2,1,rows,columns);

で、以下のデータ範囲を取得しています。(丸の数字は、後のforEachで使うインデックス番号です)

8行目の

var datas = range.getValues();

で、取得した範囲の値を配列「datas」に格納しています。

 

10行目以下の

datas.forEach(function(data){

var status = data[0];
var receipant = data[1];
var cc = data[2];
var bcc = data[3];
var subject = data[4];
var body = data[5];
var DriveUrl = data[6];

 

では、forEachメソッドでdatas配列の中身を一つずつ

取り出してそれぞれの変数に格納しています。

(このとき、インデックス番号が0から始まりまるのでややこしいですね。。)

これで、スプレッドシートの情報を取得できました。

■Google DriveのフォルダID・中のファイルを取得する

次に、Google DriveのフォルダIDと保存されているファイルをすべて取得します。

var attachments = []; //添付ファイルの空の配列を作る


    if(DriveUrl !==""){
      var id = DriveUrl.replace("https://drive.google.com/drive/u/0/folders/","");
      var folder = DriveApp.getFolderById(id);
      var files = folder.getFiles();
      while(files.hasNext()) {
        var file = files.next();
        attachments.push(file); 
      }
    }

 

1行目の、

var attachments = [];

は、添付するファイルを配列にして格納する必要があるので、空の配列をひとまず作っています。

 

4〜5行目の、

if(DriveUrl !==””){
var id = DriveUrl.replace(“https://drive.google.com/drive/u/0/folders/”,””);

の部分は、

添付するファイルがある場合、

Google DriveのID部分(共通部分であるhttps://drive.google.com/drive/u/0/folders/を除いた部分)

を抜き出しています。

共通部分を空白にしてIDだけ抜き出しているんですね。

このIDは、後でファイルを添付する際に利用します。

 

6行目〜7行目の

var folder = DriveApp.getFolderById(id);
var files = folder.getFiles();

ではDriveのフォルダーをIDで特定し、その中のファイルを抜き出しています。

 

8行目〜10行目の

while(files.hasNext()) {

var file = files.next();

attachments.push(file);

は、フォルダにファイルがある限り、

先ほど作った配列である「attachments」に格納して、

と命令しています。

結果として、フォルダ内のすべてのファイルがattachmentsに格納されます。

 

■ファイルを添付してメールを送信する

最後の部分は、オプションを指定して

Gmailを送信しています。

var options = {
      cc:cc,
      bcc:bcc,
      attachments:attachments,
  } 

  if(status === "下書き"){
    GmailApp.createDraft(receipant, subject, body, options);

  }else if(status === "送信"){
    GmailApp.sendEmail(receipant, subject, body, options); 
  }
  });
}

 

1〜4行目の

var options = {

cc:cc,

bcc:bcc,

attachments:attachments,

}

という部分は、Gmailの送信オプションである

  • Ccの宛先
  • Bccの宛先
  • 添付ファイル

を指定しています。

 

7行目〜最後の

if(status === “下書き”){

GmailApp.createDraft(receipant, subject, body, options);

}else if(status === “送信”){ GmailApp.sendEmail(receipant, subject, body, options);

}

の部分は、

スプレッドシートのステータスが「下書き」だったら

下書きのみ作成(GmailApp.createDraft)、

「送信」だったら

送信(GmailApp.sendEmail)、

(それ以外だったら何も起こらない)ようにしています。

 

イメージ動画を作ってみました。

上の2つはステータスが下書きなのでファイル添付の上下書きフォルダに保存され、

最後の1つはステータスが送信なのでファイル添付の上送信されました。

 

まとめ

Google Driveのファイルを添付してGmail送信を自動化させる

GASを紹介しました。

これらを手作業で行うのはミスにつながりやすいので、

プログラミングの使い所と考えています。

 

編集後記

週末は、金曜日に撮れなかったYoutubeにリベンジ。

 

Youtube更新情報

WordPressのオリジナルテーマ(ガタガタですが。。)

を作ってみたのでノンエンジニアなりの感想を

しゃべってみました。

最近のあたらしいこと

元町 カフェラミル

« »