Notion の task を Google tasks と共有しよう💪

# 初めに
こんにちは、こんばんは、お仕事お疲れ様です。

さて、あなたはタスク管理には何を使用しているでしょうか？
todoist でしょうか、trello でしょうか？
どちらも非常に人気なタスク管理サービスですね😊

そして最近、非常に人気なものがあります。

そうです。

**Notion**

です。

今回は、Notion で作成した DB に登録したタスクを、Google App Script を使用して Google Tasks と共有するプログラムを作成していきます。

:::note info

<details><summary>作成理由（読まなくても...）</summary>
+---

私は何を隠そう毎朝、目覚ましをセットしています。朝の五時に。
そして、その目覚ましに、Google assistant routine というのが設定できるんですね。
目覚ましのアラームを止めると、Google assistant が起動して、今日の天気などを教えてくれるというやつです。

そこで私は、Google assistant から、今日のタスクを教えていただけるように設定させていただいてます。
（毎朝私のために起動してくださるので、丁寧に紹介させていただきます🤦‍♂️）

そうです。タスク管理は Notion でしているのだから、毎朝 **「今日のタスクはありません」という非常にうれしい朝を迎えることができる** のです。

しかし、現実は厳しい...

**厳しいって**

ラ＊＊技＊部さんのようにベッドからシームレスにパソコンの前に移動できる能力など私は持ち合わせていないので、やはり目覚めてすぐに自分の今日すべきことが確認できるシステムというのはなかなかに便利なのです。

というわけで、Notion で作成したタスクを Google tasks に共有するプロジェクトを Google app script で作成しよう！

という流れになってしまったのです。
</details>

:::



# 必要なもの
※リンクは、次のセクション（必要なものの準備の仕方）に設定されています。
- [Google account](#google-account)
- [Notion account](#notion-account)
- [Notion DB](#notion-db)
- [Notion token](#notion-token)
- [Notion DB ID](#notion-db-id)

# 必要なものの準備の仕方
:::note info

リンク先のページの作成者様に感謝させていただきます。

:::

### Google account
https://www.value-domain.com/media/gmail-create/

### Notion account
https://miya-moto-memo.hatenablog.com/entry/2023/05/16/180000

### Notion DB
https://temp.co.jp/blog/2024-02-10-database

### Notion token
https://it.tarohibi.com/otionapi-token-acquisition-procedure-and-usage-settings/

### Notion DB ID
https://booknotion.site/setting-databaseid

# コードとその解説
では、キーボードをたたいていきましょう！💪

の前に、新しい GAS プロジェクトを作成したら、していただくことがあります。

Q. 何でしょうか？
A. サービスの追加です

エディタのセクションで、サイドバーから「サービス」の欄で「＋」をクリックして、「Tasks」と入力、追加します。（これにより、``Tasks.Tasks.list()`` のようにして、自分の Google tasks を簡単に呼び出せます）
※説明がわかりにくいので（ごめんなさい🙇）以下の GIF を参考にしていただけると幸いします＠＿＠∮

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/b2e8f5a9-d8e7-d9cf-922e-df37a6a0a691.gif)
Created by [ScreenToGif](https://apps.microsoft.com/detail/9n3sqk8pds8g?hl=en-us&gl=JP)

```javascript
/** Notion のトークンと、Notion でタスクを登録するデータベースの ID を設定 */
const NOTION_TOKEN = <YOUR_NOTION_TOKEN>;
const NOTION_DB_ID = <YOUR_NOTION_DB_ID>;

/** Notion API を使ってデータベースに登録しているタスクを取得する関数 */
function getNotionTasks()
{
  const URL = `https://api.notion.com/v1/databases/${NOTION_DB_ID}/query`; // Notion API の URL
  const options = {
    method: "post",
    headers: {
      "Authorization": `Bearer ${NOTION_TOKEN}`,
      "Notion-Version": "2022-06-28",
    }
  };

  try {
    const response = JSON.parse(UrlFetchApp.fetch(URL, options));  // UrlFetchApp.fetch(<URL>) で Notion API に fetch

    // response の情報の中から、タスクを取得（タスクのタイトルと、タスクのステータス（"Not started" || "In progress" || "Done"）を取得）
    return response.results.map(task => task = {
      title: task.properties.Tasks.title[0].text.content,
      status: task.properties.Status.status.name,
    });
  } catch (error) {
    Logger.log("Notion API error: " + error);
    return [];
  }
}

function syncToGoogleTasks(tasks)  // getNotionTasks() で取得したタスクを Google tasks に共有する関数
{
  // Notion のタスクを共有する Google tasks のタスクリストを取得（私は "Today's tasks" という名前のリストを使用します。）
  const taskList = Tasks.Tasklists.list().items.find(list => list.title === "Today's tasks");

  // Google tasks で、指定したタイトルのタスクリストが存在しない場合の処理
  if (!taskList) return Logger.log("Task lists not found");

  // Notion で作成するタスクに時間の設定をすることは考慮していません。ので、一日の終わりをタスクの締め切りとして設定します。
  const today = new Date();
  today.setHours(23, 59, 59, 999);
  const dueDate = today.toISOString();

  try {
    // 指定した Google tasks のタスクリストに既に何かしらのタスクが登録されていた場合の処理
    const existingTasks = Tasks.Tasks.list(taskList.id).items || [];

    // タスクの Details に記載されてある内容に "#from-notion" が含まれていた場合（つまり、そのタスクがこのプログラムによって追加されたものである場合）
    // にそのタスクを削除する処理
    existingTasks.forEach(task => {
      if (task.notes?.includes("#from-notion")) {
        Tasks.Tasks.remove(taskList.id, task.id);
      }
    });

    let taskCount = 0;

    // Notion に登録しているタスクで、ステータスが "In progress" であるタスクのみを Google tasks に追加
    tasks.forEach(task => {
      if (task.status === "In progress") {
        Tasks.Tasks.insert({
          title: task.title,
          notes: "#from-notion",
          due: dueDate,
          status: "needAction"
        }, taskList.id);
        taskCount ++;
      }
    });

    Logger.log(`${taskCount} tasks have been synced`);
  } catch (error) {
    Logger.log("Google tasks API error: " + error);
  }
}

function main() {
  const notionTasks = getNotionTasks();
  if (notionTasks.length > 0) syncToGoogleTasks(notionTasks);
}
```

コードの記述が完了しましたら、 **ちゃんと保存して** またまた、サイドバーから、「トリガ」そして、ページの右下から「トリガーを追加」->以下の設定をします☟

**実行する関数** main
**イベント元** 時間主導型
**タイムベーストリガの種類** 1時間タイマ
**インターバル** 毎時間

以上のように設定し、保存することで、あなたの Notion のタスクは毎時間に Google taks と共有されるという結果になったのです（わーすごーい）



# 最後に
Google App Script の設定の際に、二つの要因によって本来とは少し異なった名称を使用しているかもしれません。意味不明なものがありましたら（きっとありますが）編集リクエストください🤦‍♂️🤦‍♂️

:::note info
<details><summary>二つの要因（読まなくて結構です）</summary>

1. 私は太古に設定をミスったらしく Google App Script のサイトを英語で使用しています。
1. 私は英語が苦手らしく、翻訳できない単語が今回も複数見受けられました。
</details>
:::

以上で、**Notion の task を Google tasks と共有しよう💪** についての記事を終わらせていただきます。

最後まで読んでくれてありがとう！😁