搜索和替换:JavaScript的intion api SDK入门
#javascript #教程 #api #notion

概念是创建和管理各种数字内容的强大工具,例如注释,文章和数据库。但是,许多用户长时间要求的一项功能是能够在概念文档和页面中搜索和替换文本。

我的概念数据库中有很多文档,通常需要搜索所有页面并替换特定的单词和短语。

例如,我有一个表格,上面有有关如何使用远程存储库的说明,我想用“ github” “ gitlab” 替换所有实例。每个文档:

Notion database

在这篇文章中,我将向您展示如何创建一个简单的解决方法来搜索文本并在概念数据库中的多个文档中替换它。您需要的只是安装在计算机上的node.js。

链接到具有完整代码的GitHub存储库:https://github.com/andreiparfenov/search-and-replace-notion-api

intion api参考:https://developers.notion.com/reference/intro

这是一个非常简单的解决方法,我主要尝试尝试使用概念API。 请注意,我只能实现概念文本块或段落的解决方案。我的脚本将无法用于标题,代码段等。因为不同的块类型在intion api中具有不同的对象属性。该代码也远非完美,因此请随时留下您的建议以进行改进。另外,分享您与概念API合作的经验。

这是一个分步指令。

设置概念

假设您有关于概念的帐户,请访问the "My integrations" page。单击“新集成”按钮。创建一个内部集成,能够读取,更新和插入内容:

Create a Notion integration

转到要使用的数据库,按“设置”(三个点),然后单击“添加连接”。选择新创建的集成。

设置node.js应用

概念具有API的JavaScript客户端。我们将为新的Node.js项目创建一个文件夹,并在内部初始化package.json

mkdir notion-search-and-replace
npm init

现在我们有了package.json文件,让我们安装一个带有概念sdk的软件包:

npm install @notionhq/client

在项目文件夹中创建一个node.js文件(我创建app.js)并初始化intion client:

const { Client } = require("@notionhq/client");

const notion = new Client({
  auth: process.env.NOTION_TOKEN,
});

NOTION_TOKEN是您的内部集成令牌。如果您与他人共享代码,请确保它也保存在.env中。

接下来,指定脚本将搜索的值以及应替换的值。我想用“ github” “ gitlab” 在我的文本中替换出来:

const searchValue = "GitHub";
const newValue = "GitLab";

创建一个入口点函数:

(async () => {
  const db = await notion.databases.query({
    database_id: process.env.NOTION_API_DATABASE,
  });

  for (const page of db.results) {
    // we'll access the page's blocks here and update them
  }
})();

在此功能中,我们通过其ID访问数据库,并在数据库内的页面(results属性)上创建一个循环。

当我们从数据库访问每个页面时,我们需要访问页面的块。让我们在单独的功能中进行:

async function retrieveBlocks(pageId) {
  const page = await notion.blocks.children.list({
    block_id: pageId,
  });

  return page.results;
}

在概念上,页面也是一个块。这就是为什么在上面的代码中我们访问blockschildren属性。

我们需要再下一个级别,然后访问每个块内部的文本。让我们添加以下功能:

async function findAndReplace(blocks) {
  for (const block of blocks) {
    if (!block.paragraph) continue;
    const textItems = block.paragraph.rich_text;
    const newTextItems = textItems.map((item) => {
      const selectedText = item.text.content;
      const newText = selectedText.includes(searchValue)
        ? selectedText.replaceAll(searchValue, newValue)
        : selectedText;
      item.text.content = newText;
      return item;
    });
    // we'll update the corresponding block here
  }
}

在此功能中,我们使用paragraph.rich_text属性,该属性是对象数组。是的,文本内容实际上是一个数组,其中元素通过其格式化样式分开。听起来可能很复杂,但这是一个例子:

i GitHub

如果这是一个概念段落,它将在rich_text数组中具有四个元素:

  1. “ i” - 非格式
  2. “爱” - 大胆
  3. “ github” - 代码
  4. “。”。 - 非格式

the Notion API's docs中阅读有关rich-text的更多信息。

然后我们使用map()替换每个必要的实例。

最后,让我们更新整个块并插入新的文本项目:

async function updateBlock(block, newTextItems) {
  const selectedBlock = await notion.blocks.update({
    block_id: block.id,
    paragraph: {
      rich_text: newTextItems,
    },
  });
}

通过在for...of循环的末尾调用updateBlock()来更新findAndReplace()函数:

async function findAndReplace(blocks) {
  for (const block of blocks) {
    // all the previous code
    await updateBlock(block, newTextItems);
  }
}

另外,更新入口点功能:

(async () => {
  const db = await notion.databases.query({
    database_id: process.env.NOTION_API_DATABASE,
  });

  for (const page of db.results) {
    // call functions retrieveBlocks and findAndReplace here
    const blocks = await retrieveBlocks(page.id);
    findAndReplace(blocks);
  }
})();

使用以下命令运行代码:

node app.js

脚本将在数据库中的所有文档中替换“ github”的所有实例:

Page before running the script
Page after running the screen

希望您发现这有用。分享您如何使用概念API自动化工作的方法。 ðÖ