対象プランOFFLINEBUSINESSPRO
実装にかかる想定時間:約30分
イベント毎に設定する必要がある:Yes
イベント開催後、参加者が動画を何分視聴したのか、ブースに訪問されたのか、アンケートの回答はどうだったのか、という情報をリアルタイムにスプレッドシートへ一覧で書き出す方法をご紹介します。
スプレッドシート上に設定したボタンをクリックするだけで、イベント毎にリアルタイムに参加者の行動ログを取得することが可能になります。
▼スプレッドシート例
イベント開催直後、EXCELファイルの突合作業をせず、すぐに営業チームへ参加者リストをシェアすることで、導入の温度感が高い参加者へすぐにアプローチをすることが可能になります。商談化率の向上が期待できますので、ぜひご活用ください。
1. APIキーを発行する
まず初めに、APIキーの発行方法を参考にAPIキーを発行してください。
こちらのキーは手順3のGoogle Apps Scriptに設定します。一度発行したら二度と表示されませんので、発行時 メモに控えるようにしてください。
2. スプレッドシートを準備する
次に、新規作成からスプレッドシートを1つ作成します。作成したスプレッドシートに以下の2つのシートを準備してください。
① ユーザーリスト
こちらにユーザー情報や行動ログが書き出されます。まずは何も記載せず、シートの名称のみ「ユーザーリスト」に変更しましょう。
② EventKey
こちらのシートには、"A1"に「EventKey」と入力します。また、シートの名称を「EventKey」に変更しましょう。
3. Google Apps ScriptにScriptを入力する
次に、Scriptを準備します。
① [拡張機能]から[Apps Script]をクリックします。
② 以下のサンプルコードを参考に、Scriptを設定します。
サンプルコード
赤文字:EventHubから発行したAPIキー部分に手順1で発行したAPIキーを挿入してください。
また、GASに埋め込んだAPIキーの取り扱いには十分ご注意ください。APIを含んだScriptの共有をすると、悪意あるユーザーにEventHubの操作を実行される可能性があります。
青文字:複雑な処理となるため、解説文をいれております。//コメントアウトで記載しているため、Scriptにそのまま記載しても問題なく実行されますが、必要ない場合は削除しても問題ございません。
function createHeader() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
const eventSheet = ss.getSheetByName('EventKey');
var eventKey = eventSheet.getRange(1,2).getValue();
var requestUrl = `https://api.eventhub.jp/v1/users/${eventKey}?limit=1&offset=0`
var headers = {
'Content-Type': 'application/json',
'X-API-KEY': 'EventHubから発行したAPIキー'
}
var payload = {
"userType": ["participant"]
}
var options = {
"method" : "post",
"headers" : headers,
"payload": JSON.stringify(payload),
}
var response = UrlFetchApp.fetch(requestUrl, options)
var responseJson = JSON.parse(response.getContentText())
var sheet = ss.getSheetByName('ユーザーリスト')
sheet.clearContents()
for(user of responseJson.users){
// ToDo: for文にしているがresponseJson.usersは1件しか含まれないので[0]で取得することもできる
//(getUsersと処理を合わせている)
console.log(user)
var userId = user.userId
var userDetailUrl = `https://api.eventhub.jp/v1/users/${eventKey}/` + userId + '?boothLogs=true'
var headers = {
'X-API-KEY': 'EventHubから発行したAPIキー'
}
var options = {
"method" : "get",
"headers" : headers,
}
var response = UrlFetchApp.fetch(userDetailUrl, options)
var responseJson = JSON.parse(response.getContentText())
console.log(responseJson);
var userDetails = [
'userId',
'email',
'lastName',
'firstName',
'affiliation',
'department',
'position'
]
//カスタムフィールド分ループ
for(customField of responseJson.customFields){
userDetails.push(customField.name);
}
//カスタムフィールドの後に追加したいのでここで追加
userDetails.push('updatedAt');
userDetails.push('accessedAt');
for (watchTimeLog of responseJson.leadReport.watchTimeLogs) {
userDetails.push('動画視聴: ' + watchTimeLog.name)
}
for (boothLog of responseJson.leadReport.boothLogs) {
userDetails.push('ブース訪問: ' + boothLog.name)
for (material of boothLog.materials) {
userDetails.push('ブース資料DL: ' + material.name)
}
}
//パラメーター
userDetails.push('utmSource')
userDetails.push('utmMedium')
userDetails.push('utmCampaign')
userDetails.push('utmTerm')
userDetails.push('utmContent')
for (questionnaireAnswers of responseJson.leadReport.questionnaireAnswers) {
var questionnaireAnswersName = questionnaireAnswers.name;
for (question of questionnaireAnswers.questions) {
userDetails.push('アンケート: ' + questionnaireAnswersName + '-' +question.name)
}
}
sheet.appendRow(userDetails)
}
}
function getUsers() {
var ss = SpreadsheetApp.getActiveSpreadsheet()
const eventSheet = ss.getSheetByName('EventKey');
var eventKey = eventSheet.getRange(1,2).getValue();
var offset = 0;
var sheet = ss.getSheetByName('ユーザーリスト')
while(true) {
var requestUrl = `https://api.eventhub.jp/v1/users/` + eventKey + `?limit=100&offset=${offset}`
var headers = {
'Content-Type': 'application/json',
'X-API-KEY': 'EventHubから発行したAPIキー'
}
var payload = {
"userType": ["participant"]
}
var options = {
"method" : "post",
"headers" : headers,
"payload": JSON.stringify(payload),
}
var response = UrlFetchApp.fetch(requestUrl, options)
var responseJson = JSON.parse(response.getContentText())
console.log(responseJson.userCount)
if (responseJson.users.length === 0) {
break;
}
offset += 100;
// ユーザー詳細情報を取得する
var innerCount = 0
for(user of responseJson.users){
var userId = user.userId
var userDetailUrl = 'https://api.eventhub.jp/v1/users/' + eventKey + '/' + userId + '?boothLogs=true'
var headers = {
'X-API-KEY': 'EventHubから発行したAPIキー'
}
var options = {
"method" : "get",
"headers" : headers,
}
var response = UrlFetchApp.fetch(userDetailUrl, options)
var responseJson = JSON.parse(response.getContentText())
console.log(responseJson);
var userDetails = [
responseJson.userId,
responseJson.email,
responseJson.lastName,
responseJson.firstName,
responseJson.affiliation,
responseJson.department,
responseJson.position
]
//カスタムフィールド分ループ
for(customField of responseJson.customFields){
if(typeof(customField.value) == "string"){
//text,textarea
userDetails.push("'" + customField.value);
innerCount = innerCount + 1
}else{
//select,dropdown
userDetails.push(customField.value.join());
innerCount = innerCount + 1
}
}
//カスタムフィールドの後に追加したいのでここで追加
userDetails.push(responseJson.updatedAt);
userDetails.push(responseJson.accessedAt);
for (watchTimeLog of responseJson.leadReport.watchTimeLogs) {
userDetails.push(watchTimeLog.minutes)
innerCount = innerCount + 1
}
// ブースログ
for (boothLog of responseJson.leadReport.boothLogs) {
console.log(boothLog)
// boothLogはユーザータイプが出展者の場合、自社ブース ユーザー詳細取得APIのboothLogsに含まれない
// よって予め作成したHeaderとの比較を行い、自社ブースの書き込みをスキップする処理が入る
var ownBoothFlag = false //自社ブースかどうかのフラグ
if (sheet.getRange(1, 10 + innerCount).getValue() === 'ブース訪問: ' + boothLog.name) {
// Headerと比較し、ブース名が不一致の場合は自社ブース。
// ownBoothFlagフラグを立てておき、同一ループ内で再度登録を実施する(複数社に紐づくユーザーはいないため)
// 一致していれば、自社ブース以外のため処理を続行する
userDetails.push(boothLog.accessed)
} else {
// 自社ブースの場合、訪問ログはAPIから取得できないためownBoothFlagを立て、列位置をずらすため`-`を入れる
console.log("自社ブース")
userDetails.push('-')
ownBoothFlag = true
}
innerCount = innerCount + 1
// 自社ブースに関するboothLogではない場合のみ、そのまま資料ログも順次処理して書き込む
if (!ownBoothFlag) {
for (material of boothLog.materials) {
// sheet.getRange(count, 10 + innerCount).setValue(material.downloaded)
userDetails.push(material.downloaded)
innerCount = innerCount + 1
}
}
// 自社ブースの場合、複数ブースが存在するイベントだと、
// スキップした分、次のbooth情報を取ってしまっているので、同一ループで書き込みを実施する
if (ownBoothFlag) {
console.log("自社ブースフラグtrue")
while(true) {
// 取得したブースログに当たるHeader位置までinnerCountをずらす
if(sheet.getRange(1, 10 + innerCount).getValue() === 'ブース訪問: ' + boothLog.name) {
// 書き込み対象ブースログにぶつかったらブース訪問ログと資料DLログを書き込む
userDetails.push(boothLog.accessed)
for (material of boothLog.materials) {
userDetails.push(boothLog.accessed)
innerCount = innerCount + 1
}
break;
} else {
// 書き込み対象までは自社ブース訪問ログ・資料DLログのため`-`を入れる
userDetails.push('-')
innerCount = innerCount + 1
}
}
}
}
//パラメーター
userDetails.push(responseJson.leadReport.inflowChannel.utmSource)
userDetails.push(responseJson.leadReport.inflowChannel.utmMedium)
userDetails.push(responseJson.leadReport.inflowChannel.utmCampaign)
userDetails.push(responseJson.leadReport.inflowChannel.utmTerm)
userDetails.push(responseJson.leadReport.inflowChannel.utmContent)
innerCount = innerCount + 5
for (questionnaireAnswers of responseJson.leadReport.questionnaireAnswers) {
for (question of questionnaireAnswers.questions) {
console.log(question)
userDetails.push(question.value.toString())
innerCount = innerCount + 1
}
}
sheet.appendRow(userDetails)
innerCount = 0
}
}
}
function updateList() {
createHeader()
getUsers()
}
<attention>Script上でシートの名称を指定しています。手順2で作成したシートの名称「ユーザーリスト」「EventKey」を変更すると実行に失敗しますのでご留意ください。</attention>
上記Scriptを設定したら、[保存]します。
4. 更新ボタンを作成する
次に、スプレッドシート上にScriptの実行ボタンを作成します。
① [挿入]>[図形描写]から以下のようなボタンを作成します。
② 作成したボタンを右クリックして、[スクリプトを割り当て]を選択します。
③ 「updateList」と入力し、[確定]をクリックします。
④ 1列目の幅を広げ、ボタンを配置します。ヘッダー色を変更し、ヘッダーを固定すると良いでしょう。
これでボタンの作成は完了です。[更新する]ボタンをクリックすると、手順3で書いたScriptが実行されるようになりました。
5. 実際の業務で行うこと
最後に、ユーザーの行動ログを書き出す方法をご紹介します。
① 手順2で作成したシート「EventKey」の"B1"セルに、ログの書き出しを行いたいイベントのEventKeyを入力します。
<tips>EventKeyとは?
イベント毎に割り当てられるIDのことです。API連携に必要なIDを取得するを参考にKeyを取得し、スプレッドシートに書き出しを行いたいイベントのEventKeyを入力してください。</tips>
② 更新ボタンをクリックします。
<tips>- 更新ボタンをクリックすると、スプレッドシート上のデータが全て削除された上でデータの書き出しが行われます。保存しておきたいデータがシート上に残っている場合は、別のスプレッドシートにコピーする等して保管してください。
- GASの実行時間は制限があります。ユーザー数が多い場合は処理がタイムアウトする可能性もあります。</tips>
これで、イベント毎に参加者の行動ログをスプレッドシートへリアルタイムに書き出すことができるようになりました🎊 スプレッドシート上でEventKeyを変更することで、書き出したいイベントを自由に指定することができます。
ここで書き出したデータを、Salesforceのリード情報等とメールアドレスをKeyに突合することで、瞬時に営業が架電するアタックリスト等を作成することが可能になります。
さまざまな用途で、ぜひご活用ください。
6. サポート対応について
こちらでご紹介する方法は、提供する情報の継続や正確性を完全に保証するものではありません。実装方法に関するご不明な点はGoogleのサポート、もしくは社内エンジニアへお問い合わせください。
機能や取得したいAPI情報が足りない場合は、ご要望としてお伺いしますので、カスタマーサポートへお問い合わせください。