loader image

NotionとSlackを活用した究極のタスク管理術

NotionSlack連携ブログアイキャッチ

NotionとSlackを組み合わせて、究極のタスク管理体験を実現します。この強力な組み合わせにより、プロジェクトの効率と生産性が格段に向上します。

成果物

このように指定した時間にNotionに登録されているタスクが自動で送られてきます。

以下のコードをGoogle Apps Scriptに貼り付けてご利用ください。なお、WebhookおよびNotion API、Notionデータベースの設定はコメントアウト(//が書かれている部分)に従ってご変更ください。

var SLACK_WEBHOOK_URL = 'slackに追加したWebhookよりWebhook URLを挿入'; //WebhookURLの取得はSTEP1

//Notion上のタスクをスプレッドシートに同期させる関数(定期的に起動する)
function syncNotionDatabaseToSpreadsheet() {
  const notionApiKey = 'NotionAPIKeyを挿入'; //NotionAPIKeyを挿入(STEP2)
  const databaseId = ' NotionデータベースのIDを挿入'; //タスクを登録しているNotionデータベースのIDの挿入(STEP3)
  const url = 'https://api.notion.com/v1/databases/' + databaseId + '/query';
  const headers = {
    'Authorization': 'Bearer ' + notionApiKey,
    'Notion-Version': '2022-06-28',
    'Content-Type': 'application/json'
  };
  const options = {
    'method': 'post',
    'headers': headers,
  };

  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName("インポート");
  const existingIds = sheet.getRange(1, 1, sheet.getLastRow()).getValues().flat();

  data.results.forEach((result) => {
    let taskname = "TODOデータベースのタスク名のプロパティ名に置き換え"; //タスクデータベースのTitle(見出し)の名前を登録してください(STEP4)
    let datename = "TODOデータベースの期限のプロパティ名に置き換え"; //タスクデータベースの期限を登録しているプロパティの名前を入れてください(STEP4)
    const id = result.id;
    const name = result.properties.taskname.title[0]?.plain_text || "";
    const status = result.properties.status.status.name;
    let formattedDate = "";

    if (result.properties.datename && result.properties.datename.date) {
      const date = new Date(result.properties.datename.date.start);
      formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
    }

    const rowIndex = existingIds.indexOf(id) + 1;

    if (rowIndex > 0) {
      sheet.getRange(rowIndex, 2).setValue(name);
      sheet.getRange(rowIndex, 3).setValue(status);
      sheet.getRange(rowIndex, 4).setValue(formattedDate);
      sheet.getRange(rowIndex, 5).setValue()
    } else {
      sheet.appendRow([id, name, status, formattedDate]);
      existingIds.push(id);
    }
  });
}

//当日期限のタスク一覧の送信処理に使用する関数
function sendTodaysTasksToSlack() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName("当日判定"); //雛形のスプレッドシートの「当日判定」シートの名称を変更する場合はこちらも変更
  const lastRow = sheet.getLastRow();
  
  // シートからページIDとタスク名を取得
  const pageIds = sheet.getRange(2, 1, lastRow - 1).getValues().flat();
  const tasks = sheet.getRange(2, 2, lastRow - 1).getValues().flat();
  const status = sheet.getRange(2,3 ,lastRow - 1).getValues().flat();
  
  // ページIDを基にNotionページのURLを動的に生成し、それとタスク名を組み合わせる
  let combinedTasks = [];
  for (let i = 0; i < pageIds.length; i++) {
    if (pageIds[i] && pageIds[i] !== "#N/A") {
      const notionUrl = `https://www.notion.so/nishiyuki0501/${pageIds[i].replace(/-/g, '')}`;
      combinedTasks.push(tasks[i]);
      combinedTasks.push(status[i]);
      combinedTasks.push(notionUrl);
      
    }
  }

  if (combinedTasks.length > 0) {
    sendTasksToSlack(combinedTasks);
  } else {
    sendTasksToSlack(["本日のタスクはNotion上には登録されていません。"]);
  }
}

//当日完了したタスク一覧の送信処理に使用する関数
function sendTodaysTasksToSlack_done() {
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName("実績判定"); //雛形のスプレッドシートの「実績判定」シートの名称を変更する場合はこちらも変更
  const lastRow = sheet.getLastRow();
  
  // シートからページIDとタスク名を取得
  const pageIds = sheet.getRange(2, 1, lastRow - 1).getValues().flat();
  const tasks = sheet.getRange(2, 2, lastRow - 1).getValues().flat();
  
  
  // ページIDを基にNotionページのURLを動的に生成し、それとタスク名を組み合わせる
  let combinedTasks = [];
  for (let i = 0; i < pageIds.length; i++) {
    if (pageIds[i] && pageIds[i] !== "#N/A") {
      const notionUrl = `https://www.notion.so/nishiyuki0501/${pageIds[i].replace(/-/g, '')}`;
      combinedTasks.push6(tasks[i]);
      combinedTasks.push(notionUrl);
    }
  }

  if (combinedTasks.length > 0) {
    sendTasksToSlack_done(combinedTasks);
  } else {
    sendTasksToSlack_done(["本日のタスクはNotion上には登録されていません。"]);
  }
}

//sendTodaysTasksToSlack関数の送信処理
function sendTasksToSlack(tasks) {
  const today = new Date();
const formattedDate = `${today.getFullYear()}年${String(today.getMonth() + 1).padStart(2, '0')}月${String(today.getDate()).padStart(2, '0')}日`;
var payload = {
    text: '*' + formattedDate + 'のタスク一覧:*' + '\n' + tasks.join('\n' ) 
};

  var options = {
    method: 'POST',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);

}

//sendTodaysTasksToSlack_done関数の送信処理
function sendTasksToSlack_done(tasks) {
  const today = new Date();
const formattedDate = `${today.getFullYear()}年${String(today.getMonth() + 1).padStart(2, '0')}月${String(today.getDate()).padStart(2, '0')}日`;
var payload = {
    text: '*' + formattedDate + 'の完了タスク一覧:*' + '\n' + tasks.join('\n')
};


  var options = {
    method: 'POST',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);

}

各ツールのご紹介

まず、最初にNotionとslackの紹介をします。弊社でも大変お世話になっているツールで、この組み合わせで管理されている方も多いかと思いますので、導入されていない方はまずこちらからご覧ください。

Notionでのタスク管理

Notionは柔軟なタスク管理とプロジェクト計画のための多機能プラットフォームです。タスクのリスト化、進捗の追跡、期限の設定が一箇所で管理でき、独自の管理システムの構築も可能になります。

Slackでのコミュニケーション最適化

Slackは、チームコミュニケーションを効率化し、プロジェクト関連情報の共有を迅速化します。Notionで管理されているタスクの更新情報をSlackでリアルタイムに共有することで、情報の透明性が向上し、チームワークが促進されます。

NotionとSlackの統合

NotionとSlackを統合することで、タスク管理の自動化が実現します。Notionでのタスク更新時にSlackに自動通知が送られ、プロジェクトの進捗状況をチーム全体でリアルタイムに共有できます。これにより、プロジェクトの効率性が大幅に向上し、タスクの見逃しや遅延を防ぎます。

各設定項目の説明

STEP1 Webhook URLの取得

  1. slack画面からインストールアプリ画面を開く
  2. ブラウザの右上の検索窓に「webhook」と入力して、「Incoming Webhook」を選択して、アプリを追加する

STEP2 NotionAPIの取得

  1. Notion APIの公式ページに移動してください。(https://developers.notion.com/
  2. 右上のMy Integrationを押します。
  3. ご自身がわかるようなインテグレーションの名前を入力して下の写真のようになるように選択してsubmitボタンを押してください。(基本触らなくて良いはずです)
  4. Secretsのトークンキーをコピーしてください。最初のコードにコピペして使います。

STEP3 NotionデータベースのIDの取得

  • 自身のNotionページを開きます。(ブラウザ版を奨励します)
  • データ元(slackに共有したいデータが集まっているデータベース)を開きます。開くときはデータベース右上にある最大化ボタンを押してください。
  • データベースのフルページを開くと、右上の3点から連携(connection)を選択してください。こちらから先ほどのステップで追加したAPIをこのページと繋いでいきます。
  • 3点ボタンを押して、下部にある連携(connection)の中にある先ほどのステップ2で発行したNotion APIの名前を選択してください。
  • 最後にデータベースのIDを探します。リンクは以下の構成になっています。ワークスペースの部分の文字列をコピーしてください。後ほど最初のコードに埋め込みます。
    ※もしもアプリ版(パソコンソフト版)を使っている場合は⌘+Lでそのページのリンクをコピーできるのでテキストエディタなどに貼り付けて上記の文字列を探してみてください。

リンクの構成)

https://notion.so/[ワークスペースのリンク]/[データベースID]?v=[viewのリンク]

STEP4 Notionデータベースのプロパティ名の確認

  1. タスク名および期日として利用しているdateプロパティのそれぞれの名前を確認します。
  2. 最初のコードのSTEP4の部分におきかえます。(ダブルコーテーション(“)は残してテキストのみ変更してください)

STEP5 コードに反映されていく

  1. Google Apps Script(以下、GASと表記)の公式ページを開きます。(https://script.google.com/home
  2. (初めての方はログインします)
  3. エディタを開いたら、最初のコードを全てコピペしてください。最初のfunction(){}も消して、全て置き換えます。
  4. 保存して、実行を押すと権限確認が必要というポップアップが表示されるので「権限を確認」を押してください。
  5. Googleでログインすると「このアプリはGoogleに接続されていません」と出てくるので左下の「詳細」を押してください。
  6. 「詳細」を押すと「安全でないページへ移動」と出てくるので押してください。
    ※外部サービスとの連携により、情報漏洩などのリスクがあるという意味で接続には注意してくださいという意味です。
  7. 外部サービスとの接続を許可してください。(GASでプロジェクトを初めて動かすときは毎回この作業が必須になります。)

実際に動かした通知

実際に動かしてみるとslackの指定したチャンネルにその日期限(またはその日期限の完了タスク)が共有されます。

タスクとそのNotionページのURLが表示されます

通知のタイミングはGASのトリガーを用いて指定の時間にチェックするなどすれば完全に自動で送られるようになります。

結論

NotionとSlackの統合により、タスク管理はより効率的かつ効果的になります。この強力なツールの組み合わせを活用することで、チームの生産性を最大化し、プロジェクトを成功に導くことができます。

【コピペでできる!】NotionのデータベースのステータスによってLINEに自動共有する

LINE NotifyとGASの連携アイキャッチ

はじめに

多くの人が仕事や学業、日常生活において情報を整理し、効率的に管理することが求められています。

そのために、さまざまな情報管理ツールが活用されています。この記事では、人気の情報管理アプリ「Notion」と、リアルタイムの通知サービス「LINE Notify」をGoogle Apps Scriptを用いて連携させる方法をご紹介します。これにより、Notionでの情報更新やタスク管理がさらに便利になり、日常生活や仕事での情報の取り扱いが一層スムーズになることでしょう。

それでは、NotionとLINE Notifyの連携方法について詳しく見ていきましょう。

完成はこちら(Google Apps Scriptに貼り付けてください)

const LINE_NOTIFY_API_TOKEN = 'LINE NotifyのAPI keyを入力してください';
const NOTION_API_KEY = 'Notion API keyを入力してください';
const DATABASE_ID = 'NotionのデータベースのIDを入力してください';

function sendNotification() {
  const newArticles = getUnpublishedArticles();

  newArticles.forEach(article => {
    updateArticleStatus(article.id);
    sendLineMessage(article.title, article.url);
  });
}

function getUnpublishedArticles() {
  const url = `https://api.notion.com/v1/databases/${DATABASE_ID}/query`;
  const options = {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      'Content-Type': 'application/json',
      "Notion-Version": "2022-06-28",
    },
    payload: JSON.stringify({
      filter: {
        property: 'ステータス',
        select: {
          equals: '',
        },
      },
    }),
  };

  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());
  const articles = data.results.map(item => {
    return {
      id: item.id,
      title: item.properties['記事名'].title[0].text.content,
      url: item.url,
    };
  });

  return articles;
}

function updateArticleStatus(pageId) {
  const url = `https://api.notion.com/v1/pages/${pageId}`;
  const options = {
    method: 'PATCH',
    headers: {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      'Content-Type': 'application/json',
      "Notion-Version": "2022-06-28",
    },
    payload: JSON.stringify({
      properties: {
        'ステータス': {
          select: {
            name: '完了',
          },
        },
      },
    }),
  };

  UrlFetchApp.fetch(url, options);
}

function sendLineMessage(title, url) {
  const message = `新着記事のお知らせ\n${title}が公開されました!以下のリンクから確認してください!\n${url}`;
  const notifyUrl = 'https://notify-api.line.me/api/notify';
  const options = {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${LINE_NOTIFY_API_TOKEN}`,
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    payload: {
      message: message,
    },
  };

  UrlFetchApp.fetch(notifyUrl, options);
}

1. LINE NotifyのAPIを取得する

  1. LINE Notifyの公式ページを開いてください。(https://notify-bot.line.me/ja/
  2. 右上のログインをしてください。
  3. LINEに登録しているメールアドレスとパスワードを入力してログインしてください。
  4. 右上の自分の名前>マイページを押してください。
  5. マイページの下層にある「アクセストークンの発行(開発者向け)」の部分の「トークンを発行する」を選択してください。
  6. トークン名と通知するトークまたはグループを選択してください。トークン名はLINEの通知の文章に使われるのでわかる名前にすることをお勧めします。
  7. トークンをコピーしてください。(最初のコードにコピペします)

2. Notion APIの取得

  1. Notion APIの公式ページに移動してください。(https://developers.notion.com/
  2. 右上のMy Integrationを押します。
  3. ご自身がわかるようなインテグレーションの名前を入力して下の写真のようになるように選択してsubmitボタンを押してください。(基本触らなくて良いはずです)
  4. Secretsのトークンキーをコピーしてください。最初のコードにコピペして使います。

3. NotionのデータベースのIDを取得

  1. 自身のNotionページを開きます。(ブラウザ版を奨励します)
  2. データ元(LINEに共有したいデータが集まっているデータベース)を開きます。開くときはデータベース右上にある最大化ボタンを押してください。
  3. データベースのフルページを開くと、右上の3点から連携(connection)を選択してください。こちらから先ほどのステップで追加したAPIをこのページと繋いでいきます。
  4. 3点ボタンを押して、下部にある連携(connection)の中にある先ほどのステップ2で発行したNotion APIの名前を選択してください。
  5. 最後にデータベースのIDを探します。リンクは以下の構成になっています。ワークスペースの部分の文字列をコピーしてください。後ほど最初のコードに埋め込みます。
    ※もしもアプリ版(パソコンソフト版)を使っている場合は⌘+Lでそのページのリンクをコピーできるのでテキストエディタなどに貼り付けて上記の文字列を探してみてください。

補足 データベースのプロパティの調整

以下のテンプレを複製していただくことが一番簡単にできます。(下記の設定をすでに反映させております)
今回のコードを使うためには記事があるデータベースのプロパティを以下のように設定しておく必要があります。

  • 記事のタイトルをテキストプロパティの「記事名」という名前
  • 更新状況を示すためにセレクトプロパティ(単一選択)の「ステータス」をいう名前
    • ステータスの選択肢に「完了」を事前に作成しておく

https://nishiyuki0501.notion.site/Notion-LINE-Notify-0e25f22f450544fa95386c02c695235a

4. コードに反映されていく

  1. Google Apps Script(以下、GASと表記)の公式ページを開きます。(https://script.google.com/home
  2. (初めての方はログインします)
  3. エディタを開いたら、最初のコードを全てコピペしてください。最初のfunction(){}も消して、全て置き換えます。
  4. 保存して、実行を押すと権限確認が必要というポップアップが表示されるので「権限を確認」を押してください。
  5. Googleでログインすると「このアプリはGoogleに接続されていません」と出てくるので左下の「詳細」を押してください。
  6. 「詳細」を押すと「安全でないページへ移動」と出てくるので押してください。
    ※外部サービスとの連携により、情報漏洩などのリスクがあるという意味で接続には注意してくださいという意味です。
  7. 外部サービスとの接続を許可してください。(GASでプロジェクトを初めて動かすときは毎回この作業が必須になります。)

実際に動かした通知

実際に動かしてみるとLINEに記事名とそのリンクが共有されます。
記事の共有権限が「リンクを知っている人が閲覧可能」になっていることが前提ですが、通知を受け取った人が見ることができます。

通知のタイミングはGASのトリガーを用いて指定の時間にチェックするなどすれば完全に自動で送られるようになります。

最後に

いかがだったでしょうか。

少し長編にわたる内容でしたが、Notion内の情報をLINEに自動で送信することでコミュニティの運営や情報共有が円滑になる可能性が高いと思います。

こうした記事を今後も発信していきますので、ぜひ参考にしていただけますと嬉しいです。

ありがとうございました。