[정보][notion] week 관리하는 formula

 


일정을 주 별로 관리하고 싶지만, notion에는 달력에 보이는 해당 주에 대한 내용을 따로 필터할 수 있는 기능이 없다. 현재 일자로 부터 7일 전과 7일 후를 알 수 있긴 하지만 첫 째주, 둘 째주 등 해당하는 주만 관리하고 싶다는 생각이 들었다.

그렇게 해서 만들게 된 fomula는 calendar의 기간이 있는 일정이 해당 주에 해당되는지 알 수 있게 만들었다. 물론, 기간이 따로 없는 하루만 일정인 일정도 사용이 가능하다.

방법은 2가지가 있다. 하지만, 방법 1을 추천한다.

사용 방법

사용 방법은 다음과 같다.일정 관리를 하고 싶은 데이터 베이스에 가서 property추가를 누른 뒤, formula를 들어가 property 이름을 "contain week"이라고 명명한 뒤, 밑의 코드를 복사하여 붙여 넣으면 된다. 물론 property이름은 사용자 마음대로 다른 것으로 지어도 된다.

전체 코드

방법1(추천)

if(formatDate(start(prop("Date")), "w") == formatDate(now(), "w"), 1, if(formatDate(end(prop("Date")), "w") == formatDate(now(), "w"), 1, 0))

방법2

if(year(start(prop("Date"))) * 1000 + month(now()) * 10 + toNumber(formatDate(now(), "w")) >= year(start(prop("Date"))) * 1000 + month(start(prop("Date"))) * 10 + toNumber(formatDate(start(prop("Date")), "w")), if(year(start(prop("Date"))) * 1000 + month(end(prop("Date"))) * 10 + toNumber(formatDate(end(prop("Date")), "w")) >= year(start(prop("Date"))) * 1000 + month(now()) * 10 + toNumber(formatDate(now(), "w")), 1, 0), 0)

그 후 나의 예시를 따라 하면 된다. 나의 경우, 2번 째 주를 관리하고 싶었다. 하지만, "test 일정"이 4째 주에 있었는데, 아무런 filter를 하지 않는다면 내가 관리하고 싶지 않은 "test일정"도 데이터베이스에서 같이 보이게 된다. 따라서 미리 만들어 놓은 contain week값을 1로 filtering해서 해당 일정이 해당 주에 있다면 보이게 하고, 아니면 보이지 않게 한다.



방법 1 코드 원리

원리는 쉽다. if문을 써서 일정의 시작 주와 끝 주 사이에 현재가 존재한다면 contain number를 1로 해주고 아니면 0으로 해주는 것이다

    start week(일정) ≤ current week ≤ end week(일정)

이것을 formula형태로 바꾸어 본다면,

    if ( current week == start week , 1,  if ( end week == current week, 1 , 0 ))

참고로 week formula는 다음과 같다. (일정 시작날로 생각)

    formatDate(start(prop("Date")), "w") 


방법 2 코드 원리 및 한계

원리는 방법 1과 같다. 하지만, 이걸 만들 당시 주차를 표현하는 방식(formatDate(now(), "ww"))을 몰랐다. 그래서 밑과 같은 공식이 나오게 되었다. 

    start week(일정) ≤ current week ≤ end week(일정)

이것을 formula형태로 바꾸어 본다면,

    if ( current week ≥ start week , if ( end week ≥ current week, 1 , 0 ), 0 )

이렇게 큰 틀을 짜고, current week, start week, end week에 대한 formula도 적어 보면 된다. 나중에 바꿀 수 있는 형태로 하고 싶다면 current week, start week, end week를 property로 따로 관리 해도 된다. 나의 경우, 큰 틀만 짜놓고 해당 변수에 알맞는 formula를 넣어 식이 길어졌다.

년이 바뀌고, 달이 바뀌어도 주의 순서가 바뀌면 안된다. 즉, 1월의 마지막 주차에서 부터 2월의 첫째 주까지 일정이 이어진 경우, 그저 마지막 주차에 해당하는 숫자 "5"주차만 사용, 2월의 첫째 주차 숫자인 "1"만 사용한다면 5가 1보다 크므로 위의 공식이 맞지 않게 된다. 따라서, 년도와 달까지 고려하도록 밑의 공식을 current, start end week 공통적으로 사용하게 되었다.


    년도 * 1000 + 달 * 10 + 주 차 수(0~6)


start week (일정의 날을 Date라는 property에 한 경우이다. 아니면 Date이름만 바꾸면 됨)

year(start(prop("Date"))) * 1000 + month(start(prop("Date"))) * 10 + toNumber(formatDate(start(prop("Date")), "w"))

current week

year(now()) * 1000 + month(now()) * 10 + toNumber(formatDate(now(), "w"))

end week

year(end(prop("Date"))) * 1000 + month(end(prop("Date"))) * 10 + toNumber(formatDate(end(prop("Date")), "w"))

이것을 다 합치게 되면 제일 처음에 보았던 코드가 된다. 밑에도 다시 적어보겠다.

if(year(start(prop("Date"))) * 1000 + month(now()) * 10 + toNumber(formatDate(now(), "w")) >= year(start(prop("Date"))) * 1000 + month(start(prop("Date"))) * 10 + toNumber(formatDate(start(prop("Date")), "w")), if(year(start(prop("Date"))) * 1000 + month(end(prop("Date"))) * 10 + toNumber(formatDate(end(prop("Date")), "w")) >= year(start(prop("Date"))) * 1000 + month(now()) * 10 + toNumber(formatDate(now(), "w")), 1, 0), 0)

방법 2의 한계점

한계로는 달이 바뀔 때를 고려하지 못한다는 것이다. 보통 현재 달의 마지막 주와 다음 달의 첫 주가 하나의 week인 경우가 많다. 가령 20년도 12월 마지막주를 볼 때, 목요일에서 일정이 끝난다. 그래서 21년도 1월은 금요일에서 부터 시작하는데, 보통 이 주를 같은 주라고 생각하고 실제로도 그렇지만, 밑의 코드는 그것을 전혀 반영하지 못한다. 

댓글 쓰기

0 댓글