Skip to content

Instantly share code, notes, and snippets.

@koizumi7010
Created December 4, 2023 06:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koizumi7010/87d9191f16839ef43c996e60576d442a to your computer and use it in GitHub Desktop.
Save koizumi7010/87d9191f16839ef43c996e60576d442a to your computer and use it in GitHub Desktop.
Automated initial incident response
// @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