
photo credit: Instant Download Address Book for Networking – Business contacts log – printable pdf contacts tracker – A5 printable notebook for networking via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptを使ってメルマガ配信システムを作成しています。
前回は、名刺管理サービスCAMCARDの紹介と、そこから出力したデータをスプレッドシートに取り込む方法についてお伝えしました。

今回はスプレッドシートにインポートしたCAMCARDのデータを使ってメルマガ配信リストを自動更新するGoogle Apps Scriptを紹介いていきます。
これによって
- 名刺管理サービスからデータをエクスポートして
- スプレッドシートにインポートして
- スクリプト実行
これで最新のリストになります。
では行ってみましょう!
現状確認と今回のお題
まずメルマガを配信するメールアドレスのリストはスプレッドシート上にこのように作成しています。

このシートは「配信先リスト」というシート名です。
以前に紹介していますが、ここにメールアドレスが記載されていれば、メールマガジンの配信を自動で行うことができます。

さて、新たに名刺交換をした方のメールアドレスをこの配信先リストに追加していきたいのですが、手打ちだと面倒ですし、間違えることもありますよね。
また一度、配信先リストに追加したのを忘れてしまい、重複して同じメールアドレスを追加してしまう、などといったこともあり得ます。
それで、名刺管理サービスCAMCARDのデータとGoogle Apps Scriptを活用してしまおうという魂胆です。
以下がCAMCARDのデータをインポートしたシートで、シート名は「Contacts」となっています。

今回は、Contactsにあるメールアドレスのうち、まだ追加していないメールアドレスがあれば配信先リストに追加していくというスクリプトを作成していきます。
CAMCARDデータをもとにメール配信リストを更新するスクリプト
スクリプトはこちらになります。
function inportContacts(){
var mySS=SpreadsheetApp.getActiveSpreadsheet(); //スプレッドシートを取得
// 配信先リストシートとその最終行の取得
var sheetAddress=mySS.getSheetByName("配信先リスト"); //配信先リストシートを取得
var rowAddress=sheetAddress.getDataRange().getLastRow(); //配信先リストシートの最終行
// Contactsシートとその最終行の取得
var sheetContacts=mySS.getSheetByName("Contacts"); //Contactsシートを取得
var rowContacts=sheetContacts.getDataRange().getLastRow(); //Contactsシートの最終行
/* Contactsのリストについて配信先リストに同じものがあるかを検索する */
for(ci=2;ci<=rowContacts;ci++){
var flugFind = false; //配信リストに該当のメールアドレスがある:true/ない:false
for(ai=2;ai<=rowAddress;ai++){
/* 既に配信先リストに同じデータがあればフラグを立てる */
if(sheetAddress.getRange(ai,4).getValue() === sheetContacts.getRange(ci,9).getValue()){
flugFind = true;
}
}
/* flugFindがfalseのままなら配信リストに追加をする */
if(!flugFind){
sheetAddress.getRange(rowAddress+1,1).setValue(sheetContacts.getRange(ci,6).getValue()); //社名
sheetAddress.getRange(rowAddress+1,2).setValue(sheetContacts.getRange(ci,2).getValue()); //苗字
sheetAddress.getRange(rowAddress+1,3).setValue(sheetContacts.getRange(ci,3).getValue()); //名前
sheetAddress.getRange(rowAddress+1,4).setValue(sheetContacts.getRange(ci,9).getValue()); //To
rowAddress++;
}
}
}
ちょっと長いですが、流れとしては
- 配信リストおよびContactsシートとその最終行の取得
- Contactsの全てのメールアドレスについて繰り返し
- 配信リスト全体について繰り返し
- Contactsのメールアドレスが既に配信リストに存在していればフラグを立てる
- フラグが立っていなければ
- 配信リストに社名、苗字、名前、メールアドレスを追加
- 配信リスト全体について繰り返し
という流れになります。
以下詳細について解説をしていきますね。
getSheetByNameでシートを取得する
シートが一つの場合はgetActiveSheetなどで十分な場合が多いのですが、今回は二つのシートを取り扱うのでそれぞれを取得して変数に入れておく必要が出てきます。
その場合、getSheetByNameを使ってシート名を指定して取得する方法が一般的です。
とします。
今回は、変数sheetAddressに「配信先リスト」を、変数sheetContactsに「Contacts」をそれぞれ取得しています。
フラグを利用して条件分岐
Contactsのリスト内にあるメールアドレスそれぞれについて配信リストに"ない"ということを確認したら、配信リストに追加をします。
そのためにはどうしたらよいでしょうか。
まずフラグ用の変数flugFindを用意してfalseに設定をしていきます。
配信リストを一つずつなめている場合に同じメールアドレスがあった場合はflugFindをtrueにします。
最後まで同じメールアドレスがなかった場合はfalseのままですので、falseであったならば配信リストに該当のメールアドレスとその宛先情報を追加するという仕組みです。
true/falseはそれぞれ真/偽の値を表していますので、そのものをif文の条件として
if(!flugFind){
~処理~
}
とすることができます。
この場合エクスクラメーションマーク「!」は否定を意味していますので、「flugFindがtrueではないならば」という条件式になります。
実行結果
上記スクリプトを実行すると

ほとんどモザイクで恐縮ですが、配信リストにないメールアドレスの宛先について情報を追加してくれます。
まとめ
Google Apps ScriptでCAMCARDのデータからメルマガ配信リストの更新をする方法についてお伝えしました。
今回はメルマガ用のリストでしたが、これは顧客のアタックリストだったり、年賀状の宛先リストだったり、非常に汎用性が高いものだと思います。
適宜、Google Apps ScriptとエクセルVBAとを使い分けて、リストの作成作業を楽ちんにこなして頂ければと思います。
さて、本スクリプトに話を戻します。
実はこのスクリプト、実行するとわかるのですが、すごく動作が遅いんです。
Google Apps Scriptのちょっと弱いところなのですが、プログラムの書き方で大きく変わってきます。
次回はその点の解説と解決をする方法についてお伝えできればと思います。

どうぞお楽しみに!

