노션의 replaceAll, length 함수를 응용해 Person 속성(Property)에 추가한 Member(사람) 숫자만큼 통계를 내어 간단한 투표 시스템을 만들 수 있다. 이를 이용해 아이디어, 장소 투표 등 다양한 상황에서 활용할 수 있다. 

 

🔎 투표 시스템 완성본 예시


투표 시스템 완성본 예시 GIF

 

🔎 설정 방법


  1. Table 포맷의 Database 생성 (/table 입력)
  2. 투표 항목(Name), 예산(Number), 투표자(People), 득표수(Formula) 속성 추가
  3. 득표수(Formula)에 아래 수식 복사 → 붙여 넣기
if(empty(prop("투표자")), "❗️투표해주세요!", format(length(replaceAll(prop("투표자"), "[^,]", "")) + 1))

📌 투표 템플릿 퍼가기

 

 

 

✏️ Formula(함수) 설명


노션 Formula(함수)는 한 가지 방법만 사용해선 원하는 속성(Property)의 값을 직접 반환할 수 없다. 투표자(Member)의 인원수를 노션의 함수를 이용해 통계 낼 수 있는 방법은 없는 걸까? 일단 득표수(Formula) 속성을 만들어 함숫값을 prop("투표자")로 입력해보자. 그럼 아래와 같은 결과 값을 얻는다.

3명의 멤버가 투표했을 때: Member A, Member B, Member C
2명의 멤버가 투표했을 때: Member A, Member B
1명의 멤버가 투표했을 때: Member A

멤버와 멤버 사이에 콤마(,)가 들어가 있다. 3명의 투표자라면 2개의 콤마가, 2명의 투표자라면 1개의 콤마가 생성된다. 만약 100명의 투표자라면 99개의 콤마가 생길 것이다. 이 콤마의 개수를 합한 것에 1을 더한 값이 바로 투표한 인원수가 된다. 그럼 어떤 함수를 사용해야 콤마를 숫자로 반환할 수 있을까? 바로 replaceAll() 함수다.

 

 

✏️ replaceAll 함수 설명


replaceAll() 함수 설명

replaceAll은 말 그대로 뭔가를 Replace(대체) 해주는 함수다. 노션의 Formula 설명을 보면 일치하는 모든 항목을 새로운 값으로 대체해준다고 적혀있다. 이렇게만 봐선 무슨 말인지 잘 모르겠다. 아래 예제를 조금만 살펴보면 이해하기 쉽다. 

replaceAll("1-2-3", "-", "!") == "1!2!3"

1-2-3 값 중 "-"(하이픈)을 모두 "!"(느낌표)로 대체하라는 뜻이다. 그럼 1!2!3! 결괏값이 나온다. 

 

replaceAll 함수를 "득표수" Formula 속성에 적용해보면 아래 이미지와 같은 값을 얻는다. 

replaceAll(prop("투표자"), ",", "!")

득표수 Formula에 prop("투표자")만 입력했을 땐 Member A, Member B 이런 식으로 멤버와 멤버 사이에 ","(콤마) 가 생기지만,  replaceAll 함수를 사용하면 콤마를 모두 "!"(느낌표)로대치시킨다.

 

이제부터 [^abc] "정규 표현식"이라는 것을 활용해야 한다. 정규 표현식은 regexp로도 불리는데 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 언어(라고 되어있)다. 더 자세한 정규 표현식 내용은 링크를 참조하면 된다. 간단히 말하면 투표자 속성의 값을 정규 표현식을 사용하여 표현한다는 것이다. 득표수 속성에 아래 수식을 입력해보자.

replaceAll(prop("투표자"), "[^,]", "!")

그럼 아래와 같은 값을 얻는다. 정규 표현식으로 표현한 투표자 이름이 모두 "!"(느낌표)로 대체됐다.

 

투표한 인원수를 구하려면 몇 개의 콤마가 있는지만 알면 되므로, 결괏값에 콤마만 나오면 된다. 대체할 값에 넣었던 느낌표를 지워 아래 같이 입력해준다. 

replaceAll(prop("투표자"), "[^,]", "")

 

 

드디어 우리가 원하는 콤마 값만 반환했다. 이제 이 콤마가 몇 개인지 계산해주는 일만 남았다.

 

 

✏️ 콤마 개수 구하기


length 함수는 속성의 길이를 계산(반환)하는 함수다. 이 length 함수를 사용하면 간단하게 콤마의 개수를 구할 수 있다. 득표수 Formula에 아래와 같이 입력해준다. 

length(replaceAll(prop("투표자"), "[^,]", ""))

 

드디어 콤마의 개수를 구했다. 만약 투표자가 2명이라면 Member A와 Member B 사이에 콤마 1개가 생성되므로 우리가 원하는 값 보다 1이 더 적다. 따라서 아래처럼 1을 더해줘야 한다. 

length(replaceAll(prop("투표자"), "[^,]", "")) + 1

 

 

✏️ IF 함수 추가


득표수 속성에 +1이 들어가기 때문에 아무도 투표하지 않은 항목(속성)의 득표수도 1로 표시된다. IF 함수를 활용하면 이 문제를 해결할 수 있다. 아래 함수를 복사해 붙여 넣어 보자. 

if(empty(prop("투표자")), "❗️투표해주세요!", format(length(replaceAll(prop("투표자"), "[^,]", "")) + 1))

만약 투표자 속성 값이 비었다면(Empty) "❗️투표해주세요" 문구를 추가하고, 그렇지 않다면 투표자 인원수(콤마의 개수)를 표시하라는 뜻이다. "투표해주세요" 자체가 텍스트 형식이기 때문에 If의 거짓(false) 인수인 (length(replaceAll(...... 부분도 텍스트 포맷으로 변환해줘야 정상적으로 출력된다. 텍스트 포맷으로 변환해주는 함수인 format을 false 인수 앞에 추가해주면 된다.

 

▶︎ 참고글

▶︎ 투표 템플릿 퍼가기