お疲れ様です。
GeekSalonでWebコースのメンターをしています。
皆さんは以下の経験をしたことがあるでしょうか
・自分のタスクが漏れてしまった
・タスクをメンバーに対して発信するのがめんどくさい
今回はこちらの悩みをGoogle Apps Script(GAS)を使って解決したいと思います!
前提
今回使用するスプレットシート
https://docs.google.com/spreadsheets/d/1WQFyls74qA0OGuBYR5zQepurGpbLoovQ79egSTUgNIA/edit#gid=578883701
今回のゴール
スプレットシートと連携しGoogle Apps ScriptでtodoをSlackに発信する
Apps Scriptにコードを記載
function nextAction() {
//①スプレットシート取得
const spreadSheet = SpreadsheetApp.openById('1WQFyls74qA0OGuBYR5zQepurGpbLoovQ79egSTUgNIA');
//②シート取得 ※シートの名前を変える
const weekSheet = spreadSheet.getSheetByName('テンプレ');
//③シートのデータを取得
const weekdbSheet = weekSheet.getDataRange().getValues();
//④シートのE列が「保留」「進行中」のものを取得
const nextAction = [];
for (let i = 1; i < weekdbSheet.length; i++) {
const status = weekdbSheet[i][5];
if (status === '進行中' || status === '保留') { // ステータスが「進行中」または「保留」の場合のみ処理を実行
const todo = weekdbSheet[i][2];
const deadLine = weekdbSheet[i][4];
const slackId = weekdbSheet[i][6];
nextAction.push({
todo: todo,
deadLine: deadLine,
slackId: slackId,
});
}
}
//⑨スラックの通知処理
const webhookUrl = 'https://hooks.slack.com/services/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';
nextAction.forEach(task => {
const deadLine = task.deadLine;
const todo = task.todo;
const slackId = task.slackId;
// 期日をフォーマットする関数
function formatDate(date) {
const options = {
month: '2-digit',
day: '2-digit',
weekday: 'short',
};
const formattedDate = new Date(date).toLocaleDateString('en-US', options);
const weekday = formattedDate.substr(0, 3); // 曜日を取得
const datePart = formattedDate.substr(4); // 日付部分を取得
return `${datePart}(${weekday})`; // 形式を組み立てて返す
}
const formattedDeadLine = formatDate(deadLine);
const mention = `<@${slackId}>`; // Slack IDをメンションに変換
const message = `【QMリーダーからのTODO】\n\n- ${mention}\n- 【期日】: ${formattedDeadLine}\n- 【内容】: ${todo}`;
const payload = JSON.stringify({ text: message });
const options = {
method: 'post',
contentType: 'application/json',
payload: payload
};
UrlFetchApp.fetch(webhookUrl, options);
});
}
手順1:スプシから値を取得
//①スプレットシート取得
const spreadSheet = SpreadsheetApp.openById('1WQFyls74qA0OGuBYR5zQepurGpbLoovQ79egSTUgNIA');
この特定のコード行では、SpreadsheetApp.openById()メソッドを使って、指定したIDを持つスプレッドシートを取得しています。openById()メソッドは、スプレッドシートの固有のIDを使用してスプレッドシートにアクセスするために使用されます
例えば、'1VqF5QQt7EJcd7V8mVQ8zsKRxEj3xq8jJFA8iRqowxhs'というIDは、特定のGoogleスプレッドシートを一意に識別するための文字列です。このIDは、スプレッドシートのURLに含まれています。URLが https://docs.google.com/spreadsheets/d/1VqF5QQt7EJcd7V8mVQ8zsKRxEj3xq8jJFA8iRqowxhs/editである場合、最後の/d/と/editの間にある部分がスプレッドシートのIDになります。
手順2: シート取得
//②シート取得 ※シートの名前を変える
const weekSheet = spreadSheet.getSheetByName('テンプレ');
getSheetByName() メソッドは、スプレッドシート内のシートの名前を指定して、その名前に一致するシートを取得します。この場合、引用符で囲まれた部分 'テンプレ' には、目的のシートの名前が入っています。
手順3:シートのデータを取得
//③シートのデータを取得
const weekdbSheet = weekSheet.getDataRange().getValues();
const weekdbSheet = weekSheet.getDataRange().getValues(); は、特定のシートからデータを取得するためのコードです。
このコードは weekSheet シートのデータを取得し、weekdbSheet 変数にそのデータを2次元配列として格納しています。以降のコードで、この weekdbSheet 変数を使用してシートのデータを処理したり、特定の条件に基づいてデータをフィルタリングしたりすることができます。
手順4:シートのE列が「保留」「進行中」のものを取得
//④シートのE列が「保留」「進行中」のものを取得
const nextAction = [];
for (let i = 1; i < weekdbSheet.length; i++) {
const status = weekdbSheet[i][5];
if (status === '進行中' || status === '保留') { // ステータスが「進行中」または「保留」の場合のみ処理を実行
const todo = weekdbSheet[i][2];
const deadLine = weekdbSheet[i][4];
const slackId = weekdbSheet[i][6];
この部分のコードは、シートのE列(5番目の列)にある値が「保留」または「進行中」の行を取得して、それらの行のデータを nextAction という配列に追加する処理です
本日のtodoGASを作成するために一番重要なコードになります。
1. for (let i = 1; i < weekdbSheet.length; i++) { : weekdbSheet 配列の各要素を処理するためのループが始まります。ループの開始地点は i = 1 で、0ではなく1から開始している点に注意してください。これは、weekdbSheet 配列の最初の行がヘッダー行(列の名前)であり、データは2行目から始まるためです。
2. const status = weekdbSheet[i][5]; : ループ内で、現在処理中の行(i番目の行)のE列の値を status 変数に代入しています。status 変数は、現在の行のステータスを表す文字列として使われます。
3. if (status === '進行中' || status === '保留') { : status 変数の値が「進行中」または「保留」かどうかをチェックします。もしstatusがこれらのいずれかと一致する場合は、以下の処理が実行されます。
4. const todo = weekdbSheet[i][2]; : weekdbSheet 配列の現在の行(i番目の行)のC列(3番目の列)にある値(TODOの内容)を todo 変数に代入します。
5. const deadLine = weekdbSheet[i][4]; : weekdbSheet 配列の現在の行(i番目の行)のD列(5番目の列)にある値(締切日)を deadLine 変数に代入します。
6. const slackId = weekdbSheet[i][6]; : weekdbSheet 配列の現在の行(i番目の行)のF列(7番目の列)にある値(SlackのユーザーID)を slackId 変数に代入します。
nextAction.push({ todo: todo, deadLine: deadLine, slackId: slackId }); : ループ内の処理が終わったら、todo(TODOの内容)、deadLine(締切日)、および slackId(SlackのユーザーID)をオブジェクトとしてまとめ、nextAction 配列に追加します。これにより、nextAction 配列にはステータスが「進行中」または「保留」の行のデータが順番に格納されていきます。
つまり、この部分のコードは、シートのE列の値が「進行中」または「保留」の行のデータを取得し、それぞれの行のTODOの内容、締切日、およびSlackのユーザーIDを nextAction 配列に追加しているということです。
手順5:スラックの通知処理
ここからは「呪文」みたいなものなので、「GAS Slack通知」と検索すれば簡単にコードが出てくると思います。
本日は以下のようのコードを書きます
//⑨スラックの通知処理
const webhookUrl = 'https://hooks.slack.com/services/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';
nextAction.forEach(task => {
const deadLine = task.deadLine;
const todo = task.todo;
const slackId = task.slackId;
// 期日をフォーマットする関数
function formatDate(date) {
const options = {
month: '2-digit',
day: '2-digit',
weekday: 'short',
};
const formattedDate = new Date(date).toLocaleDateString('en-US', options);
const weekday = formattedDate.substr(0, 3); // 曜日を取得
const datePart = formattedDate.substr(4); // 日付部分を取得
return `${datePart}(${weekday})`; // 形式を組み立てて返す
}
const formattedDeadLine = formatDate(deadLine);
const mention = `<@${slackId}>`; // Slack IDをメンションに変換
const message = `【QMリーダーからのTODO】\n\n- ${mention}\n- 【期日】: ${formattedDeadLine}\n- 【内容】: ${todo}`;
const payload = JSON.stringify({ text: message });
const options = {
method: 'post',
contentType: 'application/json',
payload: payload
};
UrlFetchApp.fetch(webhookUrl, options);
});
}
const webhookUrl = 'https://hooks.slack.com/services/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'; : Slackへの通知を送るためのWebhook URLが定義されています。このURLはSlackのIncoming Webhookを利用して作成されたもので、特定のチャンネルにメッセージを送信するためのエンドポイントです。
nextAction.forEach(task => { ... } : nextAction 配列に対して、forEach メソッドを使ってループを行います。nextAction 配列には、ステータスが「進行中」または「保留」のTODOリストのデータが格納されています。
const deadLine = task.deadLine; : 現在処理中のTODOリストのデータから、締切日(deadLine)を取得します。
const todo = task.todo; : 現在処理中のTODOリストのデータから、TODOの内容(todo)を取得します。
const slackId = task.slackId; : 現在処理中のTODOリストのデータから、SlackのユーザーID(slackId)を取得します。
function formatDate(date) { ... } : formatDate という関数が定義されています。この関数は、渡された日付を指定されたフォーマットに整形するために使用されます。
const formattedDeadLine = formatDate(deadLine); : formatDate 関数を使用して、締切日(deadLine)を指定されたフォーマットに整形します。
const mention = <@${slackId}>; : Slackのメンションを作成するために、SlackのユーザーID(slackId)を <@ユーザーID> の形式に整形します。
const message = 【QMリーダーからのTODO】\n\n- ${mention}\n- 【期日】: ${formattedDeadLine}\n- 【内容】: ${todo}; : Slackへ送るメッセージの内容を作成します。このメッセージには、メンション、締切日、およびTODOの内容が含まれています。
つまり、この部分のコードは、Slackへの通知を行うために必要なデータを整形し、Webhookを利用してSlackの指定されたチャンネルにTODOの内容と締切日を通知する処理を行っています。
本日は以上になります
お疲れ様でした!