【営業向け】お客様への送付状を自動生成し、任意の文字列を文面に差し込みをする

##やりたいこと

営業担当者の皆様はお客様に年賀状や、暑中見舞い、もしくは郵送で資料をお送りした時の送付状の作成作業というのがあるかと思います。当然お客様毎で文書を作成すると思うのですが、一つ一つ文面コピーして、編集して、、、ってめんどくさいですよね。

せめて事前に用意されてあるテンプレートの文面に、お客様の会社名やお名前だけでも自動で差し込めたらめちゃくちゃ便利だと思うのです。ということで自動化しました。

##やること

①：Salesforceからお客様のデータをGoogleスプレッドシートに出力
②：お手紙のテンプレートから文面をコピーして、新たなドキュメントを生成
③：②で生成したドキュメントのファイル名を変更
④：②で生成したドキュメントの文面をお客様毎に変更
⑤：新たに生成されたドキュメントのURLをスラックで通知

これによって少しでも自動で業務が回るようにしてみたいと思います。

##Salesforceのデータのスプレッドシートの出力

まずは送信予定のお客様の一覧をSalesforceからダウンロードを行います。
今回はSalesforceのデータはスプレッドシートのアドオンの、Data connector for Salesforceという無料のアドオンを利用します。インストールすると、アドオンの箇所に出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/fa49c2bf-3050-c0f3-8e9d-ea1340b180aa.png)

使い方に関しては適当にググればいろいろ出てくると思うのですが、おすすめの記事はこちらです。送付が必要なお客様の一覧をSalesForceからスプレッドシートへ出力します。

https://base.terrasky.co.jp/articles/heQw1

##書面を格納しておくフォルダーの準備と、元の文面になるファイルを用意

続きまして、書面のテンプレートの用意と、文面を格納しておくフォルダーを用意しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/7b67977d-c519-ddda-c6f4-a4fe15d3a3e0.png)



##プログラムの作成と完成形

さて、送付先のお客様の出力と書面のテンプレートが用意できましたら、さっそくプログラムの作成をしていきます。ツール→スクリプトエディタからエディタを開いてプログラムを作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/a3a412d2-1e1f-d496-855d-5adc79c9e0e9.png)



ということで詳細は飛ばして完成形はこちら。コピペすればそこそこ使えるかと思いますが、詳細は追って説明します。

```js
function createDoc() {
  //プログラムを動かすための事前準備部分
  var spreadSheet          = SpreadsheetApp.openById("スプレッドシートのID");
  var contactSheet         = spreadSheet.getSheetByName('手紙送付取引先');
  var lastRow              = contactSheet.getLastRow();
  var lastColum            = contactSheet.getLastColumn();
  var values               = contactSheet.getRange(1,1, lastRow, lastColum).getValues(); 
  var length               = values.length;
  var filedId              = "テンプレートで利用する文面のドキュメントのID";
  var folderId             = "文面を格納しておくフォルダーのID";
  var templateLetterFile   = DriveApp.getFileById(filedId);
  var letterFolder         = DriveApp.getFolderById(folderId);
  var today                = new Date();
  var year                 = today.getFullYear();
  var month                = today.getMonth() + 1;
  var slackMessages = [];

  //テンプレートの文面をコピーして、差し込み文字列を文面に挿入する
  for(var i = 1; i < length; i++){
    if(values[i][14] == ""){
      var copyDoc = templateLetterFile.makeCopy("お手紙作戦_メール文面_" + values[i][2]);
      copyDoc.moveTo(letterFolder);
      var copyDocFileName  = copyDoc.getName();
      var copyDocFileUrl   = copyDoc.getUrl();
      var copyDocFileId    = copyDoc.getId();
      var doc              = DocumentApp.openById(copyDocFileId);
      var docText          = doc.getBody();
      var changedsentence  = docText
        .replaceText("【社名】",values[i][2])
        .replaceText("【ご担当者】",values[i][4])
        .replaceText("【年】",year)
        .replaceText("【月】",month);
      var slackMessage     = {"fileName": copyDocFileName, "fileUrl": copyDocFileUrl };
      slackMessages.push(slackMessage);
      console.log(changedsentence);
    }
  }

  //スラックに通知する
  postSlack(slackMessages);
};

function postSlack(slackMessages) {
  var message = "";
  var length = slackMessages.length;
  for(var i = 0; i < length; i++){
    message += slackMessages[i]["fileName"] + slackMessages[i]["fileUrl"] + " ;" + " ";
  }
  var postUrl = 'POSTするためのスラックURL';
  var username = 'bot';  // 通知時に表示されるユーザー名
  var icon = ':hatching_chick:';  // 通知時に表示されるアイコン
  var postMessage = message;  // 投稿メッセージ

  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : postMessage
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}
```

##プログラムを動かすための事前準備部分

```js
function createDoc() {
  //プログラムを動かすための事前準備部分
  var spreadSheet          = SpreadsheetApp.openById("スプレッドシートのID");
  var contactSheet         = spreadSheet.getSheetByName('手紙送付取引先');

  //スプレッドシートのデータを取得
  var lastRow              = contactSheet.getLastRow();
  var lastColum            = contactSheet.getLastColumn();
  var values               = contactSheet.getRange(1,1, lastRow, lastColum).getValues(); 
  var length               = values.length;

  //テンプレートの取得と、フォルダの取得
  var filedId              = "テンプレートで利用する文面のドキュメントのID";
  var folderId             = "文面を格納しておくフォルダーのID";
  var templateLetterFile   = DriveApp.getFileById(filedId);
  var letterFolder         = DriveApp.getFolderById(folderId);

  //差し込み時に必要な日付データの取得
  var today                = new Date();
  var year                 = today.getFullYear();
  var month                = today.getMonth() + 1;
  var slackMessages = [];
```


##テンプレートの文面をコピーして、差し込み文字列を挿入

```js
  //配列データをfor分を使い処理を行っていく
  for(var i = 1; i < length; i++){
    if(values[i][14] == ""){
      //テンプレートをコピーして、ファイル名を変更
      var copyDoc = templateLetterFile.makeCopy("送付状_" + values[i][2]);
      //コピーしたテンプレートを指定したフォルダへ移動
      copyDoc.moveTo(letterFolder);
      //コピーしたファイルからURL、ファイル名、idを取得
      var copyDocFileName  = copyDoc.getName();
      var copyDocFileUrl   = copyDoc.getUrl();
      var copyDocFileId    = copyDoc.getId();
      //コピーしたファイルを取得し、文字列を差し込む
      var doc              = DocumentApp.openById(copyDocFileId);
      var docText          = doc.getBody();
      var changedsentence  = docText
        .replaceText("【社名】",values[i][2])
        .replaceText("【ご担当者】",values[i][4])
        .replaceText("【年】",year)
        .replaceText("【月】",month);
      //スラックで通知するための文面を配列＋連想配列で用意
      var slackMessage     = {"fileName": copyDocFileName, "fileUrl": copyDocFileUrl };
      //連想配列を配列にpushする
      slackMessages.push(slackMessage);
    }
  }

  //スラックに通知する
  postSlack(slackMessages);
};
```

##スラックに通知

最後にスラックに通知をするだけです。POSTURLとかはスラックにログインすれば取得できるかと思います。以下の記事を見るとわかりやすいかと。

https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

```js
function postSlack(slackMessages) {
  var message = "";
  var length = slackMessages.length;
  for(var i = 0; i < length; i++){
    //二次元配列のデータを順次message変数に格納していき、文字列データを作成
    message += slackMessages[i]["fileName"] + slackMessages[i]["fileUrl"] + " ;" + " ";
  }
  var postUrl = 'POSTするためのスラックURL';
  var username = 'bot';  // 通知時に表示されるユーザー名
  var icon = ':hatching_chick:';  // 通知時に表示されるアイコン
  var postMessage = message;  // 投稿メッセージ

  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : postMessage
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
```

さて、プログラムを実行してみてください。おそらくこんな感じでスラックにファイル名と編集URLが送られてくるはずです。あとは必要であれば編集URLから文面作成して、送付状でも年賀状でも、なんでも作ってしまいましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/738c5b7b-9e45-9626-1260-7f2f0c0b445c.png)

##仕上げ

最後に、マクロ→createDocをクリックしてみて、マクロがちゃんと動くかチェックしてみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/cd30c564-1877-273d-7356-4b12a94bc9a8.png)