Skip to content

Instantly share code, notes, and snippets.

@ClementC
Last active February 22, 2021 17:24
Show Gist options
  • Save ClementC/9ab95d8a8085e475e5eec492815c448b to your computer and use it in GitHub Desktop.
Save ClementC/9ab95d8a8085e475e5eec492815c448b to your computer and use it in GitHub Desktop.
A small snippet to search and replace in all of your Notion.
import notion
from notion.client import NotionClient
from collections import Counter
from tqdm import tqdm
from pprint import pprint
from getpass import getpass
search_for = "value_to_be_searched"
replace_with = "new_value"
# Obtain the `token_v2` value by inspecting your browser cookies on a logged-in session on Notion.so
client = NotionClient(token_v2=getpass("Token?"))
# Search all blocks containing the domain we want to change
search_results = client.search_blocks(search_for, limit=1000)
# Pretty print the breakdown by block types
pprint(Counter([type(b) for b in search_results]))
# Define separate block types according to where we should look for text
# (this was established after manual examination)
map_block_types_by_attribute = {
"title": [notion.block.TextBlock, notion.collection.CollectionRowBlock, notion.block.BulletedListBlock,
notion.block.SubheaderBlock, notion.block.CalloutBlock, notion.block.NumberedListBlock,
notion.block.SubsubheaderBlock, notion.block.CodeBlock, notion.block.TodoBlock],
"caption": [notion.block.ImageBlock, notion.block.BookmarkBlock]
}
block_type_to_attribute = {block_type: attr
for attr, block_types_list in map_block_types_by_attribute.items()
for block_type in block_types_list}
# Replace the occurrences we want
for block in tqdm(search_results):
block_type = type(block)
attr = block_type_to_attribute.get(block_type)
if attr is None:
continue
block.__setattr__(attr,
block.__getattribute__(attr).replace(search_for,
replace_with))
@ClementC
Copy link
Author

Needs Python 3.5+, and pip install notion tqdm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment