LoginSignup
1
0

【初心者向け】スプレットシートと連携しGoogle Apps ScriptでtodoをSlackに発信する

Last updated at Posted at 2023-07-22

お疲れ様です。
GeekSalonでWebコースのメンターをしています。

皆さんは以下の経験をしたことがあるでしょうか
・自分のタスクが漏れてしまった
・タスクをメンバーに対して発信するのがめんどくさい

今回はこちらの悩みをGoogle Apps Script(GAS)を使って解決したいと思います!

前提

今回使用するスプレットシート 
https://docs.google.com/spreadsheets/d/1WQFyls74qA0OGuBYR5zQepurGpbLoovQ79egSTUgNIA/edit#gid=578883701
 

今回のゴール

スプレットシートと連携しGoogle Apps ScriptでtodoをSlackに発信する

Apps Scriptにコードを記載 

createSpreadSheet.gs
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の内容と締切日を通知する処理を行っています。

本日は以上になります 

お疲れ様でした!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0