Salesforceで簡単に作ったCSVをWindows仕様にして共有ドライブに置く力技(要Outlook)

Salesforceで簡単に作ったCSVをWindows仕様にして共有ドライブに置く力技(要Outlook)

はじめまして。エネルギーと食のベンチャーである弊社ですが、諸事情あってシステムサポートの体制を整えるにあたり、とりあえずのWordpressサイトを用意したので、情報システムのメンバーで交代でブログを書いていくことにしました。技術的な覚書を中心に書いていくので、拙いながらも、検索でたどり着いた似た悩みを持つ方のお役に立てると嬉しいです。

このドメインのサイトで紹介するサービスは、まもなく公開していきますので、それまでお待ちください。

ブログ第一回目は、まだ入社して一年経っていない新参者の私です。職歴はPHPが一番長いです。
この会社に入って初めてSalesfoeceに触れ、VBAを久しぶりに触りました。


さて、今日は、タイトルの通りのミッションをクリアしたときの覚書ですが、正確にはSalesforceで作ったCSVを、ミロク情報システム(MJS)のアプリに取り込める状態にするのが目的でした。

これまでVBAでマスタ管理をしていたのですが、それをSalesforceに移行することになりました。

それだけならよかったのですが、このマスタ情報は、最終的に経理で使用しているMJSに取り込む必要がありました。社内LAN上の共有ドライブに、MJSで設定した通りのフォルダに、設定した通りの名称と形式のCSVを入れます。これを、バッチで定期的に取り込んでいます。

  1. SalesforceでCSVを作成する
  2. CSVをLAN上の指定フォルダに入れる

これだけを行えばいいのですが、Salesforceのこともミロクのことも良く分かっていないので、覚書を残したくなるようなことがいくつかありました。


1 SalesforceでCSVを作成する

  • apex
  • Visualforceページ
  • メールテンプレート

CSVを作る方法、この三通りを検討することにしました。一番楽そうなものからを試すことにしました。
何行もあるCSVを作るときは、apexとVisualforceの組み合わせなどで実現しますが、今回は、更新のあったレコード一行だけ、トリガでCSVにしてMJSが取り込める場所に送ればよかったので、簡単にできそうだと軽く思いました。

MJSがCSVを取り込める場所……。
本当はBUFFALOのLANディスクに直接送りたいのですが、難しかったので、メールで送ることにしました。

 

~メールテンプレート編~

結論を言えば、失敗です。その理由は後で書きますが、仕様が合うのであれば便利だと思うので、参考に記入しておきます。

設定画面で「メール」で検索すると 管理 > メールテンプレート が引っかかるので、そこから作成します。

メールテンプレートの「新規作成」をおすと、まず形式を求められるので、「Visualforce」を選択してください。ここから、本文と添付CSVをまとめて作れます。

こんなふうにして、

<messaging:emailTemplate>で囲んだ内容がメールになります。

subject=”メールのタイトル”
recipientType=”メール受信者のオブジェクト(sfユーザならUser・取引先責任者ならContact)”
relatedToType=”このメールが関わるオブジェクト”

この二つのオブジェクトの内容を差し込んで表示するとができます。

<messaging:plainTextEmailBody>で囲んだ内容が、メール本文です。今回はなくてもいいくらいなので簡潔です。

そして

<messaging:attachment>で囲んだ内容が、そのまま、添付ファイルとして送られてくるのです。CSVだけでなくPDFにもできるそうです。
relatedToTypeで指定したオブジェクトの内容に{!relatedTo.nantokaCd__c}でアクセスできます。桁数などの成形にVisualforceタグが使えます。
素晴らしい! 簡単すぎる!

そう思ったのですが、

  • ファイル名が固定(本当は日付を入れたい)
  • ファイル内の日本語がURLエンコードされる

URLエンコード問題は、PDFだと文字コードを指定することで解決できるそうなのですが……。

きっと私が知らないだけだと思い、Salesforceの掲示板にきいてみました。
メールテンプレートではなく、トリガとコールアウトクラスを使うように言われたので、無理なんだな、と察しました。ありがとうございました。そのやり方を次に書きます。

 

~Visualforce編~

結論として、苦し紛れに成功です。

せっかくメールテンプレートにVisualforce形式でCSVを書いたので、これをコピペして使えるならその方がいいです(relatedTo→オブジェクト名への変換は必要ですが)。

管理画面から、ビルド > 開発 > Visualforce ページ でもいいですし、開発者コンソールでもいいですし。
繰り返しますが、今回は一行だけでいいので、apexで複数行を出すプログラムはいりません。更新したばかりの一行についてだけ、CSVを出力できればいいのです。

これで ~salesforce.com/apex/nantokaCsv?id=【SalesforceのID】 とアクセスするだけで「nantoka.csv」というCSVに。
contentType=”text/csv;charset=Shift-JIS;#nantoka.csv” で、文字コードも指定できます。
改行できないので、Salesforce上のエディタだとすごく見づらいです。

以下に、成形の覚書。

ファイル名はテキトーでいいのです。
このCSVを送るときに指定するので。でも、上で指定した文字コードは有効です。

CSVをメールで送る方法は、トリガにapexです。

 

~apex編~

やっていません!

しかし終わりまで読むと、最初からapexで、ファイルを一行一行出力した方がいいかもしれないと判断する状況も、かなりありえるので、そのときは別のサイトを調べてがんばってください。

 


2.CSVをLAN上の指定フォルダに入れる

BUFFALOのウェブアクセスで直接送り込めないか、隅々まで調べましたが、無理そうなので、メールで送ることにしたのは、前述のとおり。
トリガで送ります。メールテンプレートが使えないので仕方ありません。

 

~SalesforceからのCSVメール送信~

トリガ

こちらのサイトを非常に参考にさせていただきました。
[Salesforce]Apexで添付ファイルつきのメールを送信する
http://dackdive.hateblo.jp/entry/2015/06/20/172603

メール送信クラス
PageReference関数で、動的にファイルを取り込むことが、コールアウトクラスでないとトリガで呼び出せません。

これでkumiko.nantoka@mail.co.jpあてに、CSVがメールで送られてくるようになりました。

 

~Outlookマクロによるファイル移動~

メーラーにOutlook2013を使っていたので、VBAでマクロを組み、ファイルを移動させることにします。(VBA脱却でSalesforceに移行するはずだったのにおかしいな……)

Outlookの「開発」タブ > VisualBasic からマクロを作ります。

「開発」タブがないときは、

「ファイル」タブ(アカウント情報などに戻ります) > オプション > リボンのユーザー設定 で、

右のメニュー選択から「開発」をチェックしてください。

こちらを非常に参考にさせていただきました。
受信したメールの添付ファイルを自動保存するマクロ
https://outlooklab.wordpress.com/2007/03/10/受信したメールの添付ファイルを自動保存するマ/

ファイル移動はすんなりできるようになったのですが、ここで問題が発覚。

MJSは、改行コードがCR+LFかつ、最後行にも改行がないと取り込んでくれない。
しかしSalesforceのVisualforceで書き出したCSVは、改行がLFで、最終行は改行なしでファイルが終わる。

Visualforceでなんとかできないものかと、お世話になっているフォーラムで質問したところ、APEXで改行コードを挿入しながらCSVを作るといいって回答をいただきました。ありがとうございました。

今更CSVから作り直すのが嫌すぎたので、VBAからDOSコマンドを実行して、Windowsの標準的なCSVに変換することにしました。最初からわかってたらapexでCSV作ったかもしれない。でもOutlookは使う気満々だったからわからないな。Outlookを使ってなかったら、どうしたんだろうなあ。そんなことをもやもや考えながらも、先に進みます。

非常に参考にさせていただきました。
MS-DOSコマンドの標準出力を取得する
http://officetanaka.net/excel/vba/tips/tips27.htm

最終的に、こんなマクロができました。さっきまでVisualforceとapexだったのに、VBAです。

これを、 移動 > ルール >仕分けルールの作成(管理の方でも) で、こんなふうに設定します。
「実行する」のところで、上のマクロの名前を指定しています。

mailcsv2

これで、終了……かと思ったら、マクロがセキュリティで引っかかって動きません。自作なのにひどい話もあったものです。マクロの実行設定を変えても動きません。

 

~Outlookのセキュリティ回避~

すでに別の自作マクロが動いているOutlookには設定済かと思います。初めの時だけやってください。

参考
Office 2013 の「VBA プロジェクトのデジタル証明書」はどこに?
http://qiita.com/NAKADANobuhiro/items/ba8f8d61486d92231037

社内用ですから、てきとーな名前でいいので、デジタル証明書を作ってください。期限も長く。
office2013の場合は C:Program FilesMicrosoft Office 15rootoffice15SELFCERT.EXE これを手順通りに実行すると、作成できます。

「ファイル」タブ(アカウント情報などに戻ります) > オプション > セキュリティセンター >
「セキュリティセンターの設定」ボタン > 信頼できる発行元 に、作った証明書を追加します

 

~感想~

面倒くさかった。

 

~注意点~

マクロを仕込んだOutlookで受信したときにしか動かないので、Outlookを落とさないようにすること。

 

後日談

【補足】あのバッチ処理をwindows7&office2016に移した