Created
December 4, 2023 06:51
-
-
Save koizumi7010/87d9191f16839ef43c996e60576d442a to your computer and use it in GitHub Desktop.
Automated initial incident response
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// @ts-nocheck | |
// 障害対応ドキュメントの作成 | |
function fileCreate(){ | |
try{ | |
//ファイル名に挿入する日付部分を取得 | |
var date = new Date(); | |
date.setDate(date.getDate()); | |
var formattedDate = Utilities.formatDate(date, "JST", "yyyyMMdd"); | |
//ファイル名に挿入する障害概要を取得 | |
var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('障害対応情報'); //シート名を適宜変更してください | |
var incident = mySheet.getRange(2,2).getDisplayValue(); | |
var channel = mySheet.getRange(2,3).getDisplayValue(); | |
var commander = mySheet.getRange(2,4).getDisplayValue(); | |
var scribe = mySheet.getRange(2,5).getDisplayValue(); | |
var fileName = "障害対応"; //ファイル名を適宜変更してください | |
//コピー元のファイルを取得 | |
const templateFileID = "123456789abcdefg"; //テンプレートファイルのIDを適宜変更してください | |
var sourcefile = DriveApp.getFileById(templateFileID); | |
//コピーを作成 | |
var newfile = sourcefile.makeCopy(fileName + "_" + incident + "_" + formattedDate); | |
var newfileID = newfile.getId(); | |
//新規ファイルにcommander,scribeの情報を記入 | |
var doc = DocumentApp.openById(newfileID); | |
var body = doc.getBody(); | |
//文字列置換 | |
//それぞれのテンプレートファイルで第1引数の値を第2引数の文字列に置換 | |
body.replaceText('<タイトルを入れてください>',incident); | |
body.replaceText('<slack_channel>',channel); | |
body.replaceText('<commander>',commander); | |
body.replaceText('<scribe>',scribe); | |
doc.saveAndClose(); | |
// 編集したドキュメントを共有フォルダーに移動 | |
const folderID = "123456789abcdefg"; //フォルダーIDを適宜変更してください | |
var folder = DriveApp.getFolderById(folderID); | |
newfile.moveTo(folder); | |
var doc_id = doc.getId(); | |
var doc_url = 'https://docs.google.com/document/d/' + doc_id; | |
return doc_url; | |
} | |
catch(e) { | |
Logger.log('error occured when createDocument of' + fileName + "_" + incident + "_" + formattedDate + '. ' + e); | |
} | |
} | |
// 障害対応Slackチャンネルの作成 | |
function createChannel() { | |
// Slackチャンネル名を読み込み | |
var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('障害対応情報'); //シート名を適宜変更してください | |
var channel_name = mySheet.getRange(2,3).getDisplayValue(); | |
// スクリプトプロパティに設定したTokenを読み込み | |
var props = PropertiesService.getScriptProperties(); | |
var SLACK_TOKEN = props.getProperty('SLACK_TOKEN'); | |
// Slackチャンネルの作成 | |
var method_url = 'https://slack.com/api/conversations.create'; | |
var payload = { | |
"token": SLACK_TOKEN, | |
"name": channel_name, | |
}; | |
var option = { | |
"method": "POST", | |
"payload": payload, | |
}; | |
try { | |
var res = UrlFetchApp.fetch(method_url, option); | |
var json = JSON.parse(res).channel; | |
var chId = json.id; | |
if (JSON.parse(res).ok) { | |
return chId; | |
} | |
} | |
catch(e) { | |
Logger.log('error occured when createChannel.' + e + res + json ); | |
} | |
} | |
// ユーザーグループのメンバーを取得 | |
function getUserGroupMember(usergroup) { | |
var props = PropertiesService.getScriptProperties(); | |
var SLACK_TOKEN = props.getProperty('SLACK_TOKEN'); | |
var userGroupId = usergroup; | |
var method_url = 'https://slack.com/api/usergroups.users.list'; | |
var payload = { | |
"token": SLACK_TOKEN, | |
"usergroup": userGroupId | |
}; | |
var option = { | |
"method": "GET", | |
"payload": payload, | |
}; | |
var response = UrlFetchApp.fetch(method_url, option); | |
var responseData = JSON.parse(response); | |
if (responseData.ok) { | |
var members_list = responseData.users; | |
var members = members_list.join(','); | |
Logger.log('ユーザーグループのメンバーリスト: ' + members); | |
return members; | |
} else { | |
Logger.log('ユーザーグループのメンバーを取得できませんでした: ' + responseData.error); | |
} | |
} | |
// 障害対応Slackチャンネルへユーザグループを自動追加 | |
function addUsersFromUserGroupToChannel(channelId) { | |
var props = PropertiesService.getScriptProperties(); | |
var SLACK_TOKEN = props.getProperty('SLACK_TOKEN'); | |
var chId = channelId; | |
var userGroupId = 'ABCD1234'; // 追加したいユーザグループIDに適宜変更してください | |
var members = getUserGroupMember(userGroupId); | |
var method_url = 'https://slack.com/api/conversations.invite'; | |
var payload = { | |
"token": SLACK_TOKEN, | |
"channel": chId, | |
"users": members, | |
}; | |
var option = { | |
"method": "POST", | |
"payload": payload, | |
}; | |
var response = UrlFetchApp.fetch(method_url, option); | |
var responseData = JSON.parse(response); | |
if (responseData.ok) { | |
Logger.log('ユーザーグループのメンバーがチャンネルに追加されました'); | |
} else { | |
Logger.log('メンバーの追加に失敗しました: ' + responseData.error); | |
} | |
} | |
// 障害対応GoogleMeetの作成 | |
function getMeetUrl() { | |
const calendarId = 'primary'; // 一時的にイベントを作成するカレンダーID | |
const dt = new Date(); | |
const date = dt.getFullYear() + '-' + (dt.getMonth() + 1) + '-' + dt.getDate(); | |
const requestId = Math.random().toString(32).substring(2); // 適当な文字列を作る | |
const events = Calendar.Events.insert({ | |
summary: 'tmp_event', | |
singleEvents: true, | |
allDayEvent: true, | |
start: { date }, | |
end: { date }, | |
conferenceData: { | |
createRequest: { | |
requestId, | |
conferenceSolutionKey: { | |
type: 'hangoutsMeet' | |
}, | |
} | |
} | |
}, calendarId, { conferenceDataVersion: 1 }) | |
// MeetURLだけあれば良いので、作成後に予定そのものは削除する | |
Calendar.Events.remove(calendarId, events.id); | |
if (events.conferenceData.createRequest.status.statusCode === 'success') { | |
const meetUrl = events.conferenceData.entryPoints[0].uri; | |
return meetUrl; | |
} | |
} | |
// GoogleMeetのURLをSlackで投稿 | |
function postMeetUrl() { | |
var url = "https://slack.com/api/chat.postMessage"; | |
var props = PropertiesService.getScriptProperties(); | |
var SLACK_TOKEN = props.getProperty('SLACK_TOKEN'); | |
const meetUrl = getMeetUrl(); | |
let message = meetUrl !== undefined ? `Meetのリンクを発行しました\n${meetUrl}` : 'Meetのリンクを発行できませんでした'; | |
var payload = { | |
"token" : SLACK_TOKEN, | |
"channel" : "hoge", //使用したいチャネルに適宜変更してください | |
"text" : message, | |
"username" : "fuga" //使用したいユーザ名に適宜変更してください | |
}; | |
var params = { | |
"method" : "post", | |
"payload" : payload | |
}; | |
// Slackに投稿する | |
UrlFetchApp.fetch(url, params); | |
} | |
// SlackチャンネルをSlackで投稿 | |
function postChannel() { | |
var url = "https://slack.com/api/chat.postMessage"; | |
var props = PropertiesService.getScriptProperties(); | |
var SLACK_TOKEN = props.getProperty('SLACK_TOKEN'); | |
const channelId = createChannel(); | |
let message = channelId !== undefined ? `障害対応用Slackチャンネルを作成しました\n<#${channelId}>` : 'Slackチャンネルを作成できませんでした'; | |
addUsersFromUserGroupToChannel(channelId); // Slackチャンネルにユーザーグループを追加 | |
var payload = { | |
"token" : SLACK_TOKEN, | |
"channel" : "hoge", //使用したいチャネルに適宜変更してください | |
"text" : message, | |
"username" : "fuga" //使用したいユーザ名に適宜変更してください | |
}; | |
var params = { | |
"method" : "post", | |
"payload" : payload | |
}; | |
// Slackに投稿する | |
UrlFetchApp.fetch(url, params); | |
} | |
// 障害対応ドキュメントのURLをSlackで投稿 | |
function postDocUrl() { | |
var url = "https://slack.com/api/chat.postMessage"; | |
var props = PropertiesService.getScriptProperties(); | |
var SLACK_TOKEN = props.getProperty('SLACK_TOKEN'); | |
const docUrl = fileCreate(); | |
let message = docUrl !== undefined ? `障害対応用ドキュメントを作成しました\n${docUrl}` : '障害対応用ドキュメントを作成できませんでした'; | |
var payload = { | |
"token" : SLACK_TOKEN, | |
"channel" : "hoge", //使用したいチャネルに適宜変更してください | |
"text" : message, | |
"username" : "fuga" //使用したいユーザ名に適宜変更してください | |
}; | |
var params = { | |
"method" : "post", | |
"payload" : payload | |
}; | |
// Slackに投稿する | |
UrlFetchApp.fetch(url, params); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment