SmartStageのGoogle Forms連携方法をご案内します。
Google Forms連携とは
Google Forms連携とは、Google フォームにタスクの登録内容と同じものを準備しておくことで、ユーザーが「SmartStage」にログインすることなく問い合わせが行える機能です。
事前準備
・API トークンの発行
SmartStage WebAPIを呼び出すために、認証用の「API トークン」が必要です。
・フォームの追加とスクリプトエディタの起動
1. Googleアカウントからフォームを新規作成し、必要な項目(メールアドレス、発行者等)を追加します。
2. 右上メニューから「スクリプトエディタ」を起動し、プロジェクト名を変更してください。
スクリプトプロパティの設定
APIトークンは秘匿性の高い情報のため、スクリプトプロパティで管理します。
1. 画面左の「設定」から「appsscript.json をエディタで表示する」にチェックを入れます。
2. 「スクリプトプロパティを追加」をクリックし、プロパティに SS_API_TOKEN、値に発行したトークンを設定して保存します。
Google Apps Scriptの設定手順
1. エディタに戻り、「コード.gs」の名前を「config」に変更します。
2. 「+」ボタンから新しくスクリプト「main」を追加します。
3. 末尾の「サンプルコード一式」をそれぞれのファイルに貼り付けてください。
トリガーの設定
1. 左メニューの「トリガー」から、イベントの種類を「フォーム送信時」にして保存します。
2. 承認画面では、アカウント選択 > 詳細 > 「安全ではないページに移動」 > 「許可」の順に進めてください。
動作確認
フォームの回答を入力・送信し、SmartStageへ新規登録されているか確認します。
サンプルコード一式(コピー用)
各ファイルの内容をクリアにしてから、以下のコードを貼り付けてください。config.gsの各IDは、お客様の環境に合わせて書き換えてください。
appsscript.json
{
"timeZone": "Asia/Tokyo",
"dependencies": {
"enabledAdvancedServices": []
},
"exceptionLogging": "STACKDRIVER",
"oauthScopes": [
"https://www.googleapis.com/auth/drive.readonly",
"https://www.googleapis.com/auth/drive",
"https://www.googleapis.com/auth/forms.currentonly",
"https://www.googleapis.com/auth/forms",
"https://www.googleapis.com/auth/script.external_request"
],
"runtimeVersion": "V8"
}config.gs
const SS_API_BASE_URL_EXTERNAL = "https://api.smart-stage.io";
const SS_API_BASE_URL_INTERNAL = "https://app.smart-stage.io/apicore/v1";
const SS_WORKSPACE_ID = "xxxxxx";
const SS_DATASTORE_ID = "xxxxxx";
const SS_ACTION_ID_CREATE = "xxxxxx";
const SS_ACTION_ID_UPDATE = "xxxxxx";
const SS_FIELD_ID_CONTENTS_ATTACHMENT_FILE = "xxxxxx";
const SS_FIELD_NAME_TITLE = "タイトル";
const SS_FIELD_NAME_CONTENTS_ATTACHMENT_FILE = "内容(添付ファイル)";
const SS_ITEM_IDS = {
"サービス名": {
"PORTAL": "xxxxxx",
"給与アプリ": "xxxxxx",
"経費アプリ": "xxxxxx",
},
"ハードウェア": {
"VMware Workstation Player": "xxxxxx",
"Sun N1 Service Provisioning System": "xxxxxx",
"Surface Pro 3": "xxxxxx",
"dynabook U63/H": "xxxxxx",
"dynabook U63/M": "xxxxxx",
},
"ソフトウェア": {
"Microsoft Hyper-V": "xxxxxx",
"VMware ESXi": "xxxxxx",
"マカフイー": "xxxxxx",
"SalesForce": "xxxxxx",
"Microsoft Windows 10": "xxxxxx",
},
"ネットワーク": {
"dsra01-100001-1": "xxxxxx",
"dsra01-000003-1": "xxxxxx",
"dsra01-000002-1": "xxxxxx",
"dsra01-000001-1": "xxxxxx",
}
};main.gs
/**
* スクリプトプロパティからAPIトークンを取得
*/
const getApiToken = () = {
const scriptProperties = PropertiesService.getScriptProperties();
return scriptProperties.getProperty("SS_API_TOKEN");
};
/**
* フォームの情報からリクエストデータを作成
*/
const buildCreateRequest = (e, workspaceId) = {
const payload = {
workspaceId: workspaceId,
fields: {
},
};
const questions = e.getGradableItemResponses();
for (const question of questions) {
const title = question.getItem().getTitle();
const answer = question.getResponse();
if (!answer) continue;
switch (title) {
case "対応完了希望日":
case "発行日":
const date = new Date(answer);
payload.fields[title] = Utilities.formatDate(
date,
"Asia/Tokyo",
"yyyy-MM-dd'T'HH:mm:ss'+09:00'"
);
break;
case "発行者":
case "ユーザー":
payload.fields[title] = [answer];
break;
case "サービス名":
case "ハードウェア":
case "ソフトウェア":
case "ネットワーク":
payload.fields[title] = SS_ITEM_IDS[title][answer];
break;
case "内容(添付ファイル)":
break;
default:
payload.fields[title] = answer;
}
}
return payload;
};
/**
* フォームから添付ファイルを取得
*/
const getAttachmentFile = (e) = {
const questions = e.getGradableItemResponses();
for (const question of questions) {
const title = question.getItem().getTitle();
const answer = question.getResponse();
if (title == "内容(添付ファイル)") {
const filename = encodeURIComponent(DriveApp.getFileById(answer).getName());
const file = DriveApp.getFileById(answer).getBlob();
return { filename, file };
}
}
}
/**
* タスク作成リクエストを送信する
*/
const createRequest = async (apiToken, datastoreId, actionId, payload) = {
const createOptions = {
method: "post",
headers: {
Authorization: `Bearer ${apiToken}`,
"Content-Type": "application/json",
},
payload: JSON.stringify(payload),
muteHttpExceptions: false,
};
try {
const res = await UrlFetchApp.fetch(
`${SS_API_BASE_URL_EXTERNAL}/datastores/${datastoreId}/actions/${actionId}/create?name=true&email=true`,
createOptions
);
return JSON.parse(res.getContentText());
} catch (e) {
Logger.log(`タスク作成に失敗しました。エラー情報: ${e}`);
}
};
/**
* 添付ファイル登録リクエストを送信する
*/
const fileAttachRequest = async (apiToken, itemId, fieldId, file) = {
const attachOptions = {
method: "post",
headers: {
Authorization: `Bearer ${apiToken}`,
},
payload: file,
muteHttpExceptions: false,
};
try {
const res = await UrlFetchApp.fetch(
`${SS_API_BASE_URL_INTERNAL}/items/${itemId}/fields/${fieldId}/attachments`,
attachOptions
);
return JSON.parse(res.getContentText());
} catch (e) {
Logger.log(`ファイル添付に失敗しました。エラー情報: ${e}`);
}
};
/**
* タスク更新リクエストを送信する
*/
const updateRequest = async (
apiToken,
workspaceId,
datastoreId,
itemId,
actionId,
fieldRequired,
fieldAttachment
) = {
const payload = {
datastoreId,
workspaceId,
fields: {
...fieldRequired,
...fieldAttachment,
},
};
const updateOptions = {
method: "post",
headers: {
Authorization: `Bearer ${apiToken}`,
"Content-Type": "application/json",
},
payload: JSON.stringify(payload),
muteHttpExceptions: false,
};
try {
await UrlFetchApp.fetch(
`${SS_API_BASE_URL_EXTERNAL}/items/${itemId}/actions/${actionId}/update?name=true`,
updateOptions
);
} catch (e) {
Logger.log(`タスク更新に失敗しました。エラー情報: ${e}`);
}
};
/**
* フォーム送信時に実行されるメイン処理
*/
const onSubmit = async (e) = {
const thisResponse = (e !== undefined) ? e.response : FormApp.getActiveForm().getResponses()[2];
const apiToken = getApiToken();
const createPayload = buildCreateRequest(thisResponse, SS_WORKSPACE_ID);
const attachmentFile = getAttachmentFile(thisResponse);
const resCreate = await createRequest(apiToken, SS_DATASTORE_ID, SS_ACTION_ID_CREATE, createPayload);
if (!resCreate) return;
if (!attachmentFile) return;
const resAttach = await fileAttachRequest(apiToken, resCreate.itemId, SS_FIELD_ID_CONTENTS_ATTACHMENT_FILE, attachmentFile);
if (!resAttach) return;
const fieldRequired = {[SS_FIELD_NAME_TITLE]: createPayload.fields[SS_FIELD_NAME_TITLE]};
const fieldAttachment = {[SS_FIELD_NAME_CONTENTS_ATTACHMENT_FILE]: [resAttach.attachmentId]};
await updateRequest(apiToken, SS_WORKSPACE_ID, SS_DATASTORE_ID, resCreate.itemId, SS_ACTION_ID_UPDATE, fieldRequired, fieldAttachment);
};
何かお困りのことはございますか?まずはヘルプセンターを検索してみましょう!
その他ご不明な点があれば、サポートチームにお問い合わせください。
コメント
0件のコメント
サインインしてコメントを残してください。