시트 생성 및 업데이트 - 시트 생성

시트 생성 및 업데이트를 하나의 DAG에서 Task를 나눠 진행하였다. 처음에는 DAG를 나눠 진행하였는데 그 이유는 다음과 같다.
- 시트 생성이 다 되기 전에 업데이트 Task 진행에 대한 우려.
- 생성 및 업데이트에서 오류가 발생하더라도 다른 Task는 계속 진행되게끔 하기 위하여.

하지만 결산을 위한 시트이기에 생성 및 업데이트에 오류가 있더라도 코드 수정을 최대한 빠르게 한다면 업무에 지장이 없었고 시트 생성 후 time 라이브러리의 sleep을 활용하여 강제적으로 잠시 쉬게 만들어 해결하였다.

노션 프로젝트 관리 탭 및 결산 시트

def create_sheets():
    # === 기존 기록 로드 ===
    tabs_dict = load_file_to_dict(SHEET_TABS_INFO)
    
    # === 구글 시트 연결
    sheets = get_sheets_service()
    
    # === 노션 데이터 불러오기
    results = notion.databases.query(database_id=PROJECT_DB_ID)["results"]
    
    # 신규 프로젝트
    new_pages = []
    
    # 신규 프로젝트 체크
    for page in results:
        sheet_url = page["properties"]["sheet url"]["url"]
        if sheet_url == None:
            new_pages.append(page)
    
    # 최근 생성된 프로젝트일 수록 시트가 마지막에 생성되게끔 정열
    new_pages.reverse()
    # === 시트 복사 및 데이터 삽입
    for page in new_pages:
        props = page["properties"]
        project_name = props["프로젝트명"]["title"][0]["plain_text"]
        new_tab_title = f"{project_name}_결산"
        
        # 탭 복사
        copied_tab = sheets.spreadsheets().sheets().copyTo(
            spreadsheetId=GOOGLE_SHEET_ID,
            sheetId=TEMPLATE_TAB_ID,
            body={"destinationSpreadsheetId": GOOGLE_SHEET_ID}
        ).execute()
        
        # 새로 생긴 결산 탭 gid
        new_tab_id = copied_tab["sheetId"]

        # gid : tab_title 저장
        tabs_dict[new_tab_id] = new_tab_title

        # 탭 이름 변경
        sheets.spreadsheets().batchUpdate(
            spreadsheetId=GOOGLE_SHEET_ID,
            body={
                "requests": [
                    {
                        "updateSheetProperties": {
                            "properties": {
                                "sheetId": new_tab_id,
                                "title": new_tab_title
                            },
                            "fields": "title"
                        }
                    }
                ]
            }
        ).execute()
        
        # 노션에 링크 업데이트
        sheet_url = f"https://docs.google.com/spreadsheets/d/{GOOGLE_SHEET_ID}/edit?gid={new_tab_id}#gid={new_tab_id}"
        
        notion.pages.update(
            page_id=page["id"],
            properties={
                "sheet url": {"url": sheet_url}
            }
        )
        notion.blocks.children.append(
            block_id=page["id"],
            children=[
                {
                    "object": "block",
                    "type": "embed",
                    "embed": {
                        "url": sheet_url  # 시트 URL 입력
                    }
                },
                {
                    "object": "block",
                    "type": "heading_2",
                    "heading_2": {
                        "rich_text": [
                            {
                                "type": "text",
                                "text": {
                                    "content": "공지사항"
                                }
                            }
                        ]
                    }
                }
            ]
        )
        time.sleep(3)
        
    # 기록 저장
    save_file_to_dict(SHEET_TABS_INFO, tabs_dict)

    print("✅ 시트 생성 완료")
    time.sleep(5)

시트 생성 과정

  1. 노션에서 신규 프로젝트 여부 체크.(각 프로젝트 속성으로 시트의 url을 저장하게끔 하여 url이 채워지지 않았다면 신규 프로젝트)
  2. 신규 시트 생성(템플릿 시트 복제) 및 시트 탭 타이틀 변경
  3. 신규 시트 gid : 탭 타이틀 정보 저장(탭 타이틀 변경 사항 체크용)
  4. 신규 시트 url을 노션에 저장

'프로젝트' 카테고리의 다른 글

노션 - 구글 Sheet 연동 (5)  (0) 2025.08.20
노션 - 구글 Sheet 연동 (4)  (0) 2025.08.19
노션 - 구글 Sheet 연동 (2)  (1) 2025.07.23
노션 - 구글 Sheet 연동 (1)  (1) 2025.07.21

+ Recent posts