반응형

 

노션의 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) 값을 직접 반환할 수 없다. 투표자의 인원수를 노션의 함수를 이용해 통계 낼 수 있는 방법은 없는 걸까? 일단 득표수 속성을 만들어 함숫값을 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 함수를 사용하면 간단하게 콤마의 개수를 구할 수 있다. 득표수 수식에 아래와 같이 입력해 준다. 

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))

 

이 수식은 투표자 속성 값이 비어 있으면 "❗️투표해주세요!" 문구를 표시하고, 값이 있으면 투표자 인원수(콤마 개수 + 1)를 표시한다는 뜻이다. 조건이 참(true)일 때 반환하는 "❗️투표해주세요!"가 텍스트 형식이므로, 조건이 거짓(false)일 때 반환하는 length(replaceAll(...)) + 1 역시 텍스트 형식으로 맞춰야 오류가 발생하지 않는다. 이를 위해 숫자 결과를 텍스트 포맷으로 변환하는 format 함수로 감싸준 것이다. 

 


반응형