Open1

Notion APIをApps Scriptでゴニョゴニョする

jimjim

概要

もちろんApps Script専用のSDKなんてないので、UrlFetchAppを使っていく。
APIを呼ぶためのヘルパー関数を作って、それを元に各エンドポイントを呼ぶイメージ。

1. トークンを作る

詳細は割愛。
https://developers.notion.com/docs/authorization#internal-integration-auth-flow-set-up

2. トークンをScript Propertyに保存する

これも詳細は割愛。とりあえず、1で作ったトークンはScript Propertyに保存しておく。
この例では、NOTION_TOKENと命名する。

https://note.com/crefil/n/n2b68b3c4aa6b#:~:text=参照できない。-,実際に使ってみた,-今回はGUI

3. APIを呼ぶための関数を書く

雑にこんな感じ。

/**
 * 任意のNotion APIエンドポイントを呼ぶための関数
 *
 * @param {string} endpoint - The API endpoint to call.
 * @param {("GET"|"POST"|"PATCH"|"DELETE")} method - The HTTP method to use for the request
 * @param {Object} payload - Non-stringified payload to include in the request.
 * @returns {GoogleAppsScript.URL_Fetch.HTTPResponse} - The HTTP response object returned from the API call.
 */
const callNotionApi_ = (endpoint, method, payload) => {
  const token = PropertiesService.getDocumentProperties().getProperty(`NOTION_TOKEN`), // save your Notion API token in the script property as "NOTION_TOKEN"
    baseUrl = "https://api.notion.com/v1/",
    notionVersion = "2022-06-28";
  try {
    const params = {};
    Object.assign(params, payload);
    for (const [key, value] of Object.entries(params)) {
      if (typeof value === "object") {
        params[key] = value;
      }
    }
    const url = `${baseUrl}${endpoint}`;
    const options = {
      method: method,
      headers: {
        "Content-Type": "application/json",
        "Notion-Version": notionVersion,
        Authorization: `Bearer ${token}`,
      },
      payload: JSON.stringify(params),
    };
    const response = UrlFetchApp.fetch(url, options);
    Logger.log(`Notion API (${endpoint}) OK`);
    return response;
  } catch (error) {
    Logger.log(`Notion API ${error}`);
    return null;
  }
};

これで、callNotionApi_()を使えば、任意のエンドポイントを呼ぶことができる

使用例

例えば、Notionのページを呼びたいとする。
その場合は、こんな感じでページをページIDで取得するヘルパー関数を用意しておく。

/**
 * 任意のpage IDをもとに、ページを呼ぶための関数
 *
 * @param {string} id - The unique identifier of the page to retrieve.
 * @returns {Object} - The page data retrieved from the Notion database.
 * @throws {Error} If an error occurs during the request or response parsing, it is logged, and the function returns undefined.
 */
function getNotionPageById_(id) {
  const endpoint = `pages/${id}`;
  try {
    const response = callNotionApi_(endpoint, "GET"); //ここで3で書いた関数を使う
    if (!response) {
      throw new Error("Empty response received from Notion API");
    }
    return JSON.parse(response);
  } catch (error) {
    Logger.log("Failed to retrieve page: " + error);
    return null;
  }
}

これで、getNotionPageById_()を使ってページを呼ぶことができる。
使い方は、こんな感じ。

/**
 * Page IDを元にページを取得して、そのあとは好きなように調理する
 * See https://developers.notion.com/reference/retrieve-a-page
 */
function getPageAndDoSomething() {
  const pageId = "some_page_id"
  let data = getNotionPageById_(pageId) //data is return as page object as defined here: https://developers.notion.com/reference/page
  
  //do whatever you want with that page data
  Logger.log(data.created_by.id) // this would return the user ID of whoever created the page
}

雑に書いたけど、多分コピペで他のエンドポイントにも使えるはず。
Gistもあります
https://gist.github.com/jimokada/4d433c0af95bb6869fb5e4b99ca90fa3