SmartStageのGmail連携方法をご案内します。
目次
Gmail連携とは
Gmail連携とは、受信用メールアドレスへ指定のフォーマットで内容を送信することで、ユーザーが「SmartStage」にログインすることなく問い合わせ(タスク登録)が行える機能です。
事前準備
API トークンの発行
認証用の「API トークン」が必要です。未発行の場合は下記を参照してください。
画面項目の追加
「サービスリクエスト」プロセスに、連携に必要な以下の8項目を追加してください。
- 問い合わせ者 所属部署名(テキスト)
- 問い合わせ者 氏名(テキスト)
- 問い合わせ者 Email(テキスト)
- 発行日(日付・時刻)
- 対応希望日(日付・時刻)
- カテゴリ(選択肢:ソフトウェア、ハードウェア、ネットワーク等)
- タイトル(テキスト)
- 問い合わせ内容(複数行テキスト)
各種IDの取得
スクリプトの config.gs に設定するため、以下のIDを管理者ページから控えておいてください。
- ワークスペース ID
- データストア ID(サービスリクエスト)
- アクション ID(新しいデータを登録する)
- 各項目の 項目 ID(計8項目分)
Gmail側の準備
1. 受付用のGmailアドレスを準備します。
2. 処理済みメール判別用ラベル ss_registered を作成します。
サンプルスクリプトの配置と修正
末尾の「サンプルスクリプト一式」をテキストエディタにコピーし、事前準備で取得した各IDおよびメールアドレスへ書き換えてください。※<>は含めず上書きします。
Google Apps Scriptの設定
1. Googleドライブの「新規」>「その他」>「Google Apps Script」からエディタを起動します。
2. プロジェクト名を「Gmail連携」等に変更します。
3. 「+」ボタンから config, main, tools の3つのファイルを作成し、修正済みのコードをそれぞれ貼り付けて保存(Ctrl+S)してください。
Gmailアクセス権限の設定
スクリプトがGmailを操作できるよう権限を許可します。
1. main.gs を選択した状態で「実行」をクリックします。
2. ポップアップで「権限を確認」を選択し、アカウント選択 > 詳細 > 「Gmail連携に移動」 > 「許可」の順に進めます。
スクリプトプロパティの設定
APIトークンを設定します。
1. 左メニューの「プロジェクトの設定(歯車アイコン)」を開きます。
2. 「スクリプトプロパティを追加」をクリックし、プロパティ名 SS_API_TOKEN に発行済みのトークンを入力して保存します。
トリガーの設定
定期的にメールをチェックするよう設定します。
1. 左メニューの「トリガー(時計アイコン)」から「トリガーを追加」をクリックします。
2. 実行する関数:mailapp、イベント:時間主導型 / 分ベースのタイマー / 5分おき に設定して保存します。
動作確認
受信用アドレスへ、以下の形式でメールを送信し、SmartStageにタスクが登録されるか確認してください。
本文:
*所属部署名*:<部署名>
*お名前*:<氏名>
*問い合わせの内容*:<内容>
サンプルスクリプト一式(コピー用)
config.gs
/**
* SmartStage登録先情報
*/
const SS_API_ENDPOINT = "https://api.smart-stage.io/";
const SS_TARGET_DATASTOREID = "xxxxxx";
const SS_TARGET_ACTIONID = "xxxxxx";
/* 検索条件設定 */
const MAIL_SUBJECT_KEYWORD = "SmartStageタスク新規登録";
const GMAIL_LABEL_NAME = "ss_registered";
const MAIL_FROM_ADDRESS = "xxxxxx"; // 受信対象メールアドレス
/* 登録対象項目ID */
const DEPARTMENT = "xxxxxx"; // 問い合わせ者 所属部署
const NAME = "xxxxxx"; // 問い合わせ者 氏名
const EMAIL_ADDRESS = "xxxxxx"; // 問い合わせ者 Email
const ISSUE_DATE = "xxxxxx"; // 発行日
const PREFERRED_DATE = "xxxxxx"; // 対応希望日
const CATEGORY = "xxxxxx"; // カテゴリ
const TITLE = "xxxxxx"; // タイトル
const CONTENT = "xxxxxx"; // 問い合わせ内容
/* その他設定 */
const DAYS_LATER = 7;
const RETURNMAIL_SUBJECT = "<SmartStage>タスクを登録しました";
const RETURNMAIL_BODYTEXT = "お問い合わせありがとうございます。\nアイテムID:";
const MAIL_REPLY_ADDRESS = "xxxxxx";main.gs
function mailapp() {
GmailApp.createLabel(GMAIL_LABEL_NAME);
const labelSs = GmailApp.getUserLabelByName(GMAIL_LABEL_NAME);
const threads = GmailApp.search(`is:unread is:inbox subject:${MAIL_SUBJECT_KEYWORD} -label:${GMAIL_LABEL_NAME}`);
if (threads.length) {
for (const thread of threads) {
const messages = thread.getMessages();
messages.forEach(function (message) {
if (message.isUnread()) {
const recievedPlainbody = message.getPlainBody();
const issueDate = new Date();
const preferredDate = new Date();
preferredDate.setDate(preferredDate.getDate() + DAYS_LATER);
const bodyData = {
"fields": {
[DEPARTMENT]: extractMailBody(recievedPlainbody, '*所属部署名*:'),
[NAME]: extractMailBody(recievedPlainbody, '*お名前*:'),
[EMAIL_ADDRESS]: emailOf(message.getFrom()),
[ISSUE_DATE]: Utilities.formatDate(issueDate, 'Asia/Tokyo', "yyyy-MM-dd'T'HH:mm:ss'+09:00'"),
[PREFERRED_DATE]: Utilities.formatDate(preferredDate, 'Asia/Tokyo', "yyyy-MM-dd'T'HH:mm:ss'+09:00'"),
[CATEGORY]: '7MvWIelPL3XUx7IsCvqAw',
[TITLE]: 'メール問い合わせ',
[CONTENT]: extractMailBody(recievedPlainbody, '*問い合わせの内容*:')
},
"workspaceId": "xxxxxx"
};
const options = {
"method": "post",
"headers": { "authorization": "Bearer " + PropertiesService.getScriptProperties().getProperty("SS_API_TOKEN") },
"payload": JSON.stringify(bodyData),
"contentType": "application/json",
"muteHttpExceptions": true
};
const createResult = UrlFetchApp.fetch(`${SS_API_ENDPOINT}/datastores/${SS_TARGET_DATASTOREID}/actions/${SS_TARGET_ACTIONID}/create?name=false`, options).getContentText('UTF-8');
message.markRead();
GmailApp.sendEmail(emailOf(message.getFrom()), "タスク登録受付完了", RETURNMAIL_BODYTEXT + createResult);
}
thread.addLabel(labelSs);
});
};
}
}tools.gs
function emailOf(s) {
const emailRe = new RegExp("[a-zA-Z0-9_.+-]+@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*.)+[a-zA-Z]{2,}");
const m = s.match(emailRe);
return m ? m[0] : "";
}
function extractMailBody(text, keyword) {
let startIndex = text.indexOf(keyword);
if (startIndex === -1) return null;
startIndex += keyword.length;
let endIndex = text.indexOf("\n", startIndex);
if (endIndex === -1) return null;
return text.substring(startIndex, endIndex).trim();
}
何かお困りのことはございますか?まずはヘルプセンターを検索してみましょう!
その他ご不明な点があれば、サポートチームにお問い合わせください。
コメント
0件のコメント
サインインしてコメントを残してください。