TIL

๋…ธ์…˜ API๋ฅผ ๊ณต์ง€์‚ฌํ•ญ์— ์ ์šฉํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ?

indeeah 2024. 8. 19. 17:36

Notion API์™€ ํ•จ๊ป˜ ์ •์  ํŽ˜์ด์ง€๋กœ์˜ ์—ฌ์ • โ€“ ํ™”ํ•ด ๋ธ”๋กœ๊ทธ | ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ


๊ด€๋ฆฌ์ž๊ฐ€ ์“ฐ๊ธฐ ์‰ฌ์šด ํˆด

์šฐ๋ฆฌ ํšŒ์‚ฌ๋Š” ๋…ธ์…˜์„ ์ด๋ฏธ ์‚ฌ์šฉ ํ•˜๊ณ  ์žˆ๋‹ค. ์Šค์ผ€์ฅด๋ถ€ํ„ฐ ๊ณต์œ  ๋ฌธ์„œ ๋“ฑ์—์„œ ๋ชจ๋“  ๋ถ€์„œ๊ฐ€ ๋…ธ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์œผ๋ฉฐ, ๊ทธ๋ ‡๊ธฐ์— ๋…ธ์…˜ ์‚ฌ์šฉ์ด ์ต์ˆ™ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์ด๋ฏธ ๋ฐฑ์˜คํ”ผ์Šค์—์„œ ๊ณต์ง€์‚ฌํ•ญ ์ž…๋ ฅ ํผ์€ ๋งŒ๋“ค์–ด ๋†“์•˜์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต์ง€์‚ฌํ•ญ์— ์…‹ํŒ… ํ•ด๋†“์ง€ ์•Š์•˜๊ณ , ๋‚ด์šฉ ์ž…๋ ฅ์—์„œ๋Š” ์•„์ง ๋”ฐ๋กœ ํ…์ŠคํŠธ ์ž…๋ ฅ๊ธฐ ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ธ€์ž์— ์Šคํƒ€์ผ ์ ์šฉ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค. ํ…์ŠคํŠธ ์ž…๋ ฅ๊ธฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋˜์ž–์•„? ์‹ถ์ง€๋งŒ ํ…Œ์ด๋ธ” ์…‹ํŒ…์ด ์•„์ง ์•ˆ๋๊ธฐ์— ๋…ธ์…˜ API๋ฅผ ์ ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๊ณ„ํš

์ € ์œ„์˜ ํ™”ํ•ด ๋ธ”๋กœ๊ทธ์— ๋„ˆ๋ฌด๋„ ์ž์„ธํžˆ ์จ์ ธ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋กœ ํ•œ๋‹ค.

  1. ๋…ธ์…˜ integration ์ถ”๊ฐ€
  2. ์›ํ•˜๋Š” ํŽ˜์ด์ง€์— connection ์ถ”๊ฐ€
  3. database ํŽ˜์ด์ง€ ์ถ”๊ฐ€
  4. properties ์„ธํŒ…
  5. ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
  6. API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
  7. ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋ณ€๊ฒฝ
  8. HTML ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ
  9. ์˜ˆ์˜๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ-๐Ÿ’ซ

๋…ธ์…˜ API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ

@notionhq/client ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

const notion = new Client({ auth: token });

์—ฌ๊ธฐ์„œ token์€ integration ์ถ”๊ฐ€ ์‹œ ๋ฐ›๋Š” secret์ด๋‹ค.

์ฃผ์˜ํ•  ์ 

๋…ธ์…˜ API ํ˜ธ์ถœ์€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ์˜ ํ˜ธ์ถœ์€ CORS ERROR๋ฅผ ์ผ์œผํ‚จ๋‹ค!

๊ณต์ง€์‚ฌํ•ญ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ

๊ณต์ง€์‚ฌํ•ญ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ํ•„ํ„ฐํ•ด์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ๋‹ค.

  1. ๋‚ด๊ฐ€ ๋ณด์—ฌ์ค„ ์‚ฌ์ดํŠธ์— ๊ด€ํ•œ ๋ฐ์ดํ„ฐ
  2. ๊ณต์ง€์‚ฌํ•ญ ๋ฐ์ดํ„ฐ
  3. ๋…ธ์ถœ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ
  4. ๋…ธ์ถœ์ผ์ž์—์„œ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

๋…ธ์…˜ ๋ฆฌ์ŠคํŠธ์—์„œ๋Š” properties๋ฅผ ์ด์šฉํ•ด์„œ ์ฟผ๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ์ฟผ๋ฆฌ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๋‹ค.

// ๋‹จ์ผ ํ•„ํ„ฐ
filter: {
    property: '์ด๋ฆ„',
    [property type]: {
        [๋น„๊ต๋ฌธ]: '๋‚ด์šฉ',
    },
}
// ๋‹ค์ค‘ ํ•„ํ„ฐ
filter: {
    and: [
        {
            property: '์ด๋ฆ„',
            [property type]: {
                [๋น„๊ต๋ฌธ]: '๋‚ด์šฉ',
            }
        },
    ],
}

๋น„๊ต๋ฌธ์€ property์˜ ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ ๋“ฏ ํ•˜๋‹ค.

๋…ธ์…˜ ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ฐพ์งˆ ๋ชปํ•˜์˜€๊ณ , ์ฝ”ํŒŒ์ผ๋Ÿฟ์ด๋‚˜ ChatGPT์—์„œ ๋„์›€์„ ๋ฐ›๋Š”๋‹ค๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

sortํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

sorts: [
    {
        property: 'property ์ด๋ฆ„',
        direction: 'ascending or descending',
    },
],

limit๋ฅผ ์ง€์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.

page_size: number | undefined

ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ์ ์šฉํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

const response = await notion.databases.query({
  database_id: databaseId,
  page_size: !isNaN(Number(limit)) ? Number(limit) : undefined,
  filter: {
    and: [
      {
        property: '์‚ฌ์ดํŠธ',
        select: {
          equals: '๋ฐฑ์˜คํ”ผ์Šค',
        },
      },
      {
        property: 'ํƒœ๊ทธ',
        select: {
          equals: '๊ณต์ง€์‚ฌํ•ญ',
        },
      },
      {
        property: '์ƒํƒœ',
        status: {
          equals: '๋…ธ์ถœ',
        },
      },
      {
        property: '๋…ธ์ถœ์ผ์ž',
        date: {
          on_or_before: dayjs().format('YYYY-MM-DD'),
        },
      },
    ],
  },
  sorts: [
    {
      property: '๋…ธ์ถœ์ผ์ž',
      direction: 'descending',
    },
  ],
});

databaseId ๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์˜

https://www.notion.so/name/[databaseId]?.. ์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜ํ•  ์ 

property์˜ ์ด๋ฆ„์ด ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ ํƒ€์ž…์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋˜๋ฉด ์ฟผ๋ฆฌ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
๋ญ ์ด๋ ‡๊ฒŒ ์‰ฝ๊ฒŒ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€? ์‹ถ์—ˆ์ง€๋งŒ, SQL์—์„œ ์ปฌ๋Ÿผ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค.

response๋ฅผ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// response
{
  object: 'list',
  results: [
    {
      object: 'page',
      id: 'page-id',
      created_time: '2024-05-23T02:30:00.000Z',
      last_edited_time: '2024-05-23T09:23:00.000Z',
      created_by: [Object],
      last_edited_by: [Object],
      cover: null,
      icon: null,
      parent: [Object],
      archived: false,
      in_trash: false,
      properties: [Object],
      url: 'https://www.notion.so/',
      public_url: null
    },
  ],
}

response๋งŒ ์ฐ์–ด ๋ด์„œ๋Š” ๊ณต์ง€์‚ฌํ•ญ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์“ธ๋งŒํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ๊ณต์ง€์‚ฌํ•ญ ์„ธ๋ถ€ ๋‚ด์šฉ์„ ๋ณด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ id๋งŒ ๊ฑด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด์™ธ์— ์ง€์ •ํ•œ properties(์ปฌ๋Ÿผ๋“ค)๋ฅผ ๋ณด๋ ค๋ฉด properties๋ฅผ ๋ณด์•„์•ผ ํ•œ๋‹ค.

ํƒ€์ž… ๋ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ˆ ๊ผญ ์ฐ์–ด๋ณด๊ธฐ๋ฅผ ๊ถŒํ•œ๋‹ค.

๊ณต์ง€์‚ฌํ•ญ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์–ป์—ˆ๋‹ค!

const notices = response.results.map((result: any) => {
    return {
        id: result.id,
        title: result.properties['์ œ๋ชฉ'].title[0].plain_text,
        category: result.properties['์นดํ…Œ๊ณ ๋ฆฌ'].multi_select.map(
            (category: { name: string }) => category.name,
        ),
        displayedAt: result.properties['๋…ธ์ถœ์ผ์ž'].date.start,
    };
});

๊ณต์ง€์‚ฌํ•ญ ์„ธ๋ถ€ ๋‚ด์šฉ ๊ฐ€์ ธ์˜ค๊ธฐ

ํŽ˜์ด์ง€ ์„ธ๋ถ€ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์™€๋ณด๋ฉด ๋”์ฐํ•œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

const blocks = await notion.blocks.children.list({ block_id: pageId });

{
  object: 'list',
  results: [
    {
      object: 'block',
      id: '',
      parent: [Object],
      created_time: '2024-05-23T02:48:00.000Z',
      last_edited_time: '2024-05-23T10:51:00.000Z',
      created_by: [Object],
      last_edited_by: [Object],
      has_children: false,
      archived: false,
      in_trash: false,
      type: 'heading_2',
      heading_2: [Object]
    },
    {
      object: 'block',
      id: '',
      parent: [Object],
      created_time: '2024-05-23T02:48:00.000Z',
      last_edited_time: '2024-05-23T02:48:00.000Z',
      created_by: [Object],
      last_edited_by: [Object],
      has_children: false,
      archived: false,
      in_trash: false,
      type: 'heading_1',
      heading_1: [Object]
    },
    {
      object: 'block',
      id: '',
      parent: [Object],
      created_time: '2024-05-23T02:49:00.000Z',
      last_edited_time: '2024-05-23T02:49:00.000Z',
      created_by: [Object],
      last_edited_by: [Object],
      has_children: true,
      archived: false,
      in_trash: false,
      type: 'table',
      table: [Object]
    },
    {
      object: 'block',
      id: '',
      parent: [Object],
      created_time: '2024-05-23T02:48:00.000Z',
      last_edited_time: '2024-05-23T10:26:00.000Z',
      created_by: [Object],
      last_edited_by: [Object],
      has_children: false,
      archived: false,
      in_trash: false,
      type: 'code',
      code: [Object]
    },
    {
      object: 'block',
      id: '',
      parent: [Object],
      created_time: '2024-05-23T10:27:00.000Z',
      last_edited_time: '2024-05-23T10:27:00.000Z',
      created_by: [Object],
      last_edited_by: [Object],
      has_children: false,
      archived: false,
      in_trash: false,
      type: 'paragraph',
      paragraph: [Object]
    }
  ],
  next_cursor: null,
  has_more: false,
  type: 'block',
  block: {},
  request_id: ''
}

๋” ์ด์ƒ ์•Œ๊ณ ์‹ถ์ง€ ์•Š์•„์กŒ๋‹ค.

๊ทธ ํŽ˜์ด์ง€์— ์–ด๋–ค ๋‚ด์šฉ์ด ์“ฐ์—ฌ์งˆ์ง€ ๋ชจ๋ฅด๋Š”๋ฐ paragraph, code, heading ๋“ฑ์„ ์ง์ ‘ ์ •๋ฆฌํ•ด์ฃผ๊ณ  ์‹ถ์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋ž˜์„œ notion-to-md ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ํ•„์š”๊ฐ€ ์—†์ด ์ด๊ฒŒ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋งŒ๋“ค์–ด ์ค„ ๊ฒƒ์ด๋‹ค.

const mdBlocks = await n2m.pageToMarkdown(pageId);
const mdContent = n2m.toMarkdownString(mdBlocks).parent;

์•ˆํƒ€๊น๊ฒŒ๋„ ์ œ๋ชฉ ๋“ฑ properties๋“ค์€ ๋ฆฌํ„ดํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•ด์ค€๋‹ค.

const page = (await notion.pages.retrieve({ page_id: pageId })) as any;

์˜ˆ์˜๊ฒŒ(?) ๋ณด์—ฌ์ฃผ๊ธฐ

๋งˆํฌ๋‹ค์šด์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ HTML ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

marked ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

const [content, setContent] = useState<string>('');

useEffect(() => {
    const convertMarkdownToHtml = async () => {
        const htmlString = await marked(notice.mdContent);

        setContent(htmlString);
    };

    convertMarkdownToHtml();
}, []);

return (
    <div dangerouslySetInnerHTML={{ __html: content }} />
);

tailwind๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ์ง€ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์•„์„œ css ํŒŒ์ผ๋„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

.markdown-body {
  font-family: Arial, sans-serif;
  line-height: 1.6;
  padding: 20px;
}

.markdown-body h1 {
  font-size: 2em;
  margin-bottom: 0.5em;
}

.markdown-body h2 {
  font-size: 1.75em;
  margin-bottom: 0.5em;
}

.markdown-body h3 {
  font-size: 1.5em;
  margin-bottom: 0.5em;
}

.markdown-body h4 {
  font-size: 1.25em;
  margin-bottom: 0.5em;
}

.markdown-body p {
  margin-bottom: 0.8em;
}

.markdown-body ul,
.markdown-body ol {
  margin: 0 0 1em 1.5em;
}

.markdown-body li {
  margin-bottom: 0.5em;
}

.markdown-body a {
  color: #0366d6;
  text-decoration: none;
}

.markdown-body a:hover {
  text-decoration: underline;
}

.markdown-body code {
  background-color: #f6f8fa;
  border-radius: 3px;
  font-size: 85%;
  padding: 0.2em 0.4em;
}

.markdown-body pre {
  background-color: #f6f8fa;
  border-radius: 3px;
  padding: 1em;
  overflow: auto;
}

.markdown-body blockquote {
  border-left: 0.25em solid #dfe2e5;
  padding: 0.5em 1em;
  color: #6a737d;
  background-color: #f6f8fa;
}

.markdown-body table {
  width: 100%;
  border-collapse: collapse;
  margin-bottom: 1em;
}

.markdown-body th,
.markdown-body td {
  border: 1px solid #dfe2e5;
  padding: 0.5em 1em;
}

.markdown-body th {
  background-color: #f6f8fa;
  font-weight: bold;
}

.markdown-body img {
  max-width: 100%;
  height: auto;
}

์™„์„ฑ

์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ

๋ฐฑ์˜คํ”ผ์Šค์— ๋ณ„๋‹ค๋ฅธ ๊ตฌํ˜„ ์—†์ด ๋…ธ์…˜ ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์ฝ์–ด ์˜ค๋Š” ๊ฒƒ์€ ์ฐธ ๋งค๋ ฅ์ ์ธ ๋ฐฉ์‹์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์†๋„ ๋ฉด์—์„œ๋„ ์•„์‰ฌ์šด ๋ถ€๋ถ„์€ ์—†์—ˆ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ต์ˆ™ํ•œ ํˆด๋กœ ์‰ฝ๊ฒŒ ์ž…๋ ฅ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š”๊ฒŒ ์ œ์ผ ํฐ ์žฅ์ ์œผ๋กœ ์ƒ๊ฐ๋œ๋‹ค. ๋˜ํ•œ ์‰ฌ์šด ์Šคํƒ€์ผ ๋ณ€๊ฒฝ๋„ ์žฅ์ ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ ๋„ ๋Š๊ปด์กŒ๋‹ค.

๋‹จ์ 

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์กฐ์‹ฌ์„ฑ์„ ๋ฐ”๋ผ์•ผ ํ•œ๋‹ค.
    • property๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฐ”๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์ด ๋‹น์—ฐํ•˜์ง€๋งŒ, SQL์ฒ˜๋Ÿผ ์–ด๋– ํ•œ ๋ช…๋ น๋ฌธ์„ ์ณ์„œ ๋ฐ”๋€Œ๋Š”๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด ์†์‰ฝ๊ฒŒ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ฑ์ด ์žˆ๋‹ค.
      • property ๋ณ€๊ฒฝ์€ ๊ผญ ๊ฐœ๋ฐœ๋ถ€์„œ์— ํ™•์ธ ํ›„ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ธ์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ์ˆ˜์ • ์ค‘์ธ ๊ธ€์ธ์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์—†๋‹ค.
      • ์ฐพ์•„๋ณธ ๋ฐ”๋กœ๋Š” ๋…ธ์…˜์˜ ์ž๋™ ์ €์žฅ ๊ธฐ๋Šฅ์ด ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฑธ ๋„๋Š” ๋ฐฉ๋ฒ•์€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.
      • Formula ํ•จ์ˆ˜๋ฅผ ์ด์šฉ ํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ์™„๋ฒฝํ•˜๊ฒŒ ์›ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์—†๋‹ค.
        • ์˜ˆ) if(now() > prop("๋…ธ์ถœ์ผ์ž") and prop("์ƒํƒœ") == "๋…ธ์ถœ", prop("Last edited time").dateAdd(1, "hours") > now(), false) : ์ˆ˜์ • ํ›„ 1์‹œ๊ฐ„ ๋’ค ๋…ธ์ถœ ๋“ฑ..
  • ํ•œ ์ฟผ๋ฆฌ์— MAX LIMIT๊ฐ€ ์žˆ๋‹ค.
    • page_size์— undefined๋ฅผ ๋„ฃ์œผ๋ฉด 100๊ฐœ๊นŒ์ง€์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ํ•œ๋‹ค.
    • next_cursor๋“ฑ์œผ๋กœ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, API ์ƒ์—์„œ ์ด์ „ ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์•„ ๋”ฐ๋กœ ๊ตฌํ˜„์ด ํ•„์š”ํ•˜๋‹ค.
      • ๊ทธ๋Ÿฌ๋‚˜ 3ํŽ˜์ด์ง€์—์„œ 5ํŽ˜์ด์ง€๋กœ ์ด๋™์ด๋‚˜ 7ํŽ˜์ด์ง€์—์„œ 4ํŽ˜์ด์ง€์˜ ์ด๋™ ๋“ฑ์€ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋งˆํฌ๋‹ค์šด์ด๋‚˜ HTML์„ ์•Œ์•„์•ผ ์™„๋ฒฝํžˆ ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • ๊ธ€์ž ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋“ฑ์€ ๋งˆํฌ๋‹ค์šด์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ HTML์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
      • <span style="color:red;">๊ธ€์ž</span> ๋“ฑ..
    • ๋‹ค์ค‘ ์—”ํ„ฐ ๋“ฑ..

์œ„์˜ ๋‹จ์ ๋“ค์„ ์ด๊ฒจ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•  ์˜ˆ์ •์ธ ๊ณต์ง€์‚ฌํ•ญ๋ณด๋‹ค๋Š” ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๋” ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฃฐ ๋‚ด์šฉ๊ฐ™์€ ์•ฝ๊ด€ ๋“ฑ์— ์ ํ•ฉํ•˜๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.