Sai는 소스에서 최신 값을 가져와 데이터 열을 업데이트하며, 수동으로 주석이 달린 행은 건너뜁니다. 각 실행은 타임스탬프와 변경된 행 수와 함께 기록됩니다. 실행에 실패하면 오래된 데이터가 그대로 남지 않도록 Slack 메시지를 보냅니다.
The recording is a real session. The sheet on the right is what it produced.
Sai opens each profile, pulls the signal, and writes the row, live, in a real browser.

Eight columns, sorted by score, with a source link behind every claim.
시트 URL, 데이터 소스, 데이터가 포함된 열, 수동 주석이 포함된 열, 매칭할 키 열이 필요합니다. 실패 알림을 받으려면 Slack 워크스페이스가 필요합니다.
데이터 열이 업데이트된 시트(주석이 달린 행은 그대로 유지됨). 타임스탬프, 업데이트된 행, 건너뛴 행, 추가된 행, 소스 일치 항목이 없는 행을 기록하는 실행당 로그 행 하나. 쓰기 전 검사가 실패할 경우 Slack 메시지.
소스의 업데이트 주기에 맞춰 일정을 설정하세요. 매주 업데이트되는 소스를 매일 실행하는 것은 의미가 없습니다. 변경 사항이 없다는 로그 행만 생성될 뿐입니다.
대부분의 경우 세 가지 접근 방식으로 해결할 수 있습니다.
Apps Script는 Google의 내장 스크립팅 환경입니다. 시간 기반 트리거는 일정에 따라 함수를 실행하고, onEdit 트리거는 셀이 변경될 때 함수를 실행합니다. 무료이며 Google 인프라에서 실행되고 Sheets API에 대한 전체 액세스 권한을 가집니다. JavaScript 작성이 필요합니다.
Zapier, Make, n8n은 코딩 없이 스프레드시트를 다른 애플리케이션과 연결합니다. 행 업데이트 및 행 추가 작업, 실행 기록, 재시도 기능을 제공합니다. 인터페이스를 통해 구성되며 작업 또는 작업당 비용이 청구됩니다.
내장 기능인 IMPORTRANGE, IMPORTHTML, IMPORTDATA및 매크로 기록은 별도의 설정 없이 더 간단한 경우를 처리합니다.
세 가지 방법 모두 일정에 따라 시트를 업데이트할 수 있습니다. 그 부분은 이미 해결된 문제입니다.
각 방식의 기본 동작은 대상 범위를 덮어쓰는 것입니다.
Apps Script 업데이트 루프는 지정된 행에 주어진 값을 기록합니다. Zapier의 행 업데이트(Update Row) 작업은 매핑된 필드를 교체합니다. IMPORTRANGE 함수는 전체 출력 범위를 대체하며, 제자리에서 편집하는 것이 불가능합니다.
시트에 기계가 작성한 데이터만 있을 때는 이것이 올바른 동작입니다. 하지만 흔히 그렇듯 시트에 사람이 직접 입력한 데이터가 함께 포함되어 있다면 문제가 됩니다.
추적 시트에는 보통 두 종류의 열이 포함됩니다.
데이터 열은 가격, 수량, 날짜, 상태 등 소스에서 가져온 값을 담고 있습니다. 이 값들은 업데이트될 때마다 교체되어야 합니다.
주석 열은 데이터를 확인한 후 사람이 내린 판단을 담고 있습니다. 예시 시트의 G열에는 다음과 같은 항목들이 포함되어 있습니다. 변경 없음, 기준 재작성, 실질적 감소, 그리고 플랜 중단이 중 어느 것도 원본에서 도출할 수 없습니다. 각 항목은 누군가가 이번 주와 지난주를 비교하여 그 차이가 무엇을 의미하는지 판단한 결과입니다.
시트를 단일 범위로 취급하는 업데이트는 두 항목을 모두 덮어씁니다. 데이터는 올바르게 교체되지만, 판단 근거는 사라지며 해당 내용이 존재했다는 기록조차 남지 않습니다.
일반적인 대응 방식은 시트 자동화를 중단하는 것입니다. 예시 시트에서 그 결과를 확인할 수 있습니다. "매주 월요일 수동 업데이트 · 마지막 수정: 3주 전." 또한 여기에는 #ERROR! 가 한 행에 포함되어 있고 n/a 가 다른 행에 걸쳐 있는데, 이는 수동 관리가 소홀해질 때 나타나는 전형적인 현상입니다.
주석이 달린 행은 어떤 열에서도 수정되지 않습니다.
이 규칙은 열 단위가 아닌 행 단위로 적용됩니다. 주석이 달린 행의 데이터 열만 업데이트하고 주석을 그대로 두면 업데이트하거나 건너뛰는 것보다 더 나쁜 결과가 초래됩니다. 주석은 더 이상 존재하지 않는 값을 설명하게 되며, 마치 현재 값을 설명하는 것처럼 읽히기 때문입니다.
건너뛴 행은 집계되어 보고됩니다. 200개 행 중 40개를 건너뛰었다면 그 사실이 표시됩니다. 건너뛰기는 오류는 아니지만 눈에 띄지 않는 것도 아닙니다. 건너뛴 행 수가 늘어난다는 것은 시트에서 업데이트되지 않는 부분이 점점 커지고 있다는 뜻이며, 이는 반드시 확인해야 할 사실입니다.
행 순서가 아닌 키 열을 사용하여 원본과 시트 간의 행을 매칭합니다.
위치 기반 업데이트는 작업자가 시트를 정렬하거나 행을 삽입 또는 삭제할 때 문제가 발생합니다. 이는 시트 작업 중 흔히 일어나는 일입니다. 이 오류는 조용히 발생합니다. 값이 잘못된 행에 기록되어도 시트 형태는 정상적으로 보이기 때문입니다. 오류를 알리는 신호가 없으므로, 나중에야 비로소 오류를 발견하게 되거나 아예 발견하지 못할 수도 있습니다.
키 매칭은 행마다 비교 과정을 거치므로 이러한 유형의 오류를 원천적으로 차단합니다.
어느 한쪽 방향으로 기본값을 설정하면 데이터가 손실될 수 있으므로, 두 가지 경우를 명시적으로 정의해야 합니다.
소스에는 있지만 시트에 일치하는 행이 없는 경우, 해당 행은 삭제되지 않고 추가됩니다.
시트에는 있지만 소스에 일치하는 행이 없는 경우, 해당 행은 삭제되지 않고 그대로 유지됩니다. 소스에서 행이 누락된 것은 항목이 삭제되었음을 의미할 수도 있고, 소스가 부분적인 결과만 반환했음을 의미할 수도 있습니다. 시트 측에서는 이를 구분할 수 없으며, 이를 근거로 삭제를 수행할 경우 복구가 불가능합니다.
두 수치 모두 로그에 기록됩니다.
각 실행 시 타임스탬프, 업데이트된 행 수, 건너뛴 행 수, 추가된 행 수, 일치하지 않는 행 수, 사용된 소스 정보가 한 행씩 추가됩니다.
이를 통해 데이터를 일일이 확인하지 않고도 시트의 상태를 파악할 수 있습니다. 예를 들어, 업데이트된 행은 0개이고 건너뛴 행이 200개라면 특정 의미를 갖습니다. 200개의 행이 있는 시트에 400개의 행이 추가되었다면 키 매칭이 제대로 이루어지지 않고 있다는 뜻이며, 이는 보통 소스의 키 열이 변경되었음을 의미합니다.
양방향 동기화. 이 작업은 시트에 데이터를 기록할 뿐, 소스로 다시 기록하지는 않습니다.
셀 서식이나 수식. 이 작업은 값만 기록합니다. 시트에 설정된 조건부 서식, 데이터 유효성 검사, 수식 등은 영향을 받지 않지만, 이 작업이 관리하지는 않습니다.
행 삭제. 어떠한 데이터도 삭제되지 않습니다.
1분 미만의 업데이트. 이 작업은 일정에 따라 실행됩니다. 셀 편집 시 이벤트 기반 업데이트가 필요한 경우, Apps Script의 onEdit 트리거를 사용하는 것이 직접적인 방법입니다.
Apps Script 대체. 주석 열이 없고 소스가 안정적인 시트라면, 시간 기반 Apps Script 트리거를 사용하여 비용 없이 동일한 작업을 수행할 수 있습니다. 여기에 설명된 규칙은 시트에 머신 데이터와 사람의 판단이 함께 포함되어 있을 때 그 가치를 발휘합니다.