SSmart Life US

← 목록 · 2026-08-09 · 엑셀·업무 자동화

구글시트 바코드 스캔 입력 만들기 | Apps Script 6편

구글시트 바코드 스캔 입력 만들기 | Apps Script 6편

도입 — 바코드 스캐너를 쓰는데도 손이 바쁜 이유

구글시트 바코드 스캔 입력 만들기를 검색하는 분들은 대부분 이미 핸디 스캐너는 갖고 있지만, 정작 입고·출고할 때마다 시트와 스캐너 장비 사이를 번갈아 조작해야 하는 불편을 느끼고 있습니다. 바코드를 스캔한 뒤 키보드로 셀을 옮기고, 수량을 적고, 시트를 전환하는 과정에서 손과 눈이 여러 번 분산됩니다. 이상적인 흐름은 단순합니다. 스캐너로 바코드 스캔 → Enter → 자동 저장까지 한 번에 처리되는 구조입니다.

바코드 스캔 자동입력 흐름

이번 글에서는 키보드 입력(HID) 방식으로 동작하는 바코드 스캐너·휴대폰 앱을 기준으로, 구글시트 우측 Apps Script 사이드바에서 바코드를 받고 Enter 한 번으로 입고·출고 시트에 자동 기록하는 흐름을 실제 코드로 구현합니다. 스캔 시점에 형식 검증과 일정 시간 내 중복 스캔 방지도 함께 처리하도록 구성해, 단순 테스트 수준이 아닌 실무에서 바로 활용 가능한 최소 단위를 목표로 합니다.

이 글은 구글시트로 창고 재고 시스템을 만드는 시리즈의 6편입니다. 앞에서는 입고·출고 시트를 분리하고, 구글시트 출고 자동화 방법: Apps Script 2편구글시트 재고 자동 집계 방법 | Apps Script 3편에서 재고 수량을 자동 집계하고 리포트까지 메일로 발송하는 구조를 만들었습니다. 이번 편에서는 여기에 구글시트 바코드 스캐너 연동을 더해, 사람이 시트를 직접 편집하지 않고도 작업할 수 있는 스캔 입력단을 완성합니다.


바코드 스캔 입력의 기본 개념 정리

구글시트에 바로 바코드를 찍어 넣으려면, 먼저 스캐너가 어떤 방식으로 입력을 전달하는지 이해하는 것이 중요합니다. 이 글에서 다루는 방식은 키보드 입력(HID) 방식 스캐너·앱을 전제로 합니다. 이 방식의 장비는 바코드를 읽으면 숫자·문자 문자열을 키보드가 입력하듯 순서대로 보내고, 마지막에 Enter(줄바꿈)를 한 번 전송하는 구조로 동작합니다. 별도 드라이버 설치 없이도 브라우저 입력 칸에 그대로 글자가 들어오는 장비라면 대부분 여기에 해당합니다.

이 특성을 이용하면 복잡한 API 연동 없이도 Apps Script 사이드바 스캔 입력만으로 충분히 작업을 자동화할 수 있습니다. 흐름은 다음과 같습니다. 먼저 구글시트 오른쪽에 사이드바를 띄우고, 그 안에 바코드 텍스트 박스·입출고 구분·수량·저장 버튼을 둡니다. 스캐너로 바코드를 읽으면 텍스트 박스에 코드가 들어오고, Enter를 누르거나 스캐너가 자동으로 Enter를 보내면 저장 함수가 실행됩니다. 이때 Apps Script가 코드를 받아 구글시트 입고출고 바코드 자동입력을 수행합니다.

실제 창고 현장에서는 여러 사용자가 동시에 작업하고, 바코드가 잘못 인식되는 경우도 있습니다. 따라서 단순히 셀에 직접 스캔하는 방식보다, 스크립트가 앞단에서 형식 검증(정규식)과 중복 스캔 방지를 처리하는 채널을 두는 편이 안전합니다. 이번 글의 코드는 이 최소 안전 장치를 포함한 예제로, 이후에 구조를 확장하기 쉬운 형태로 작성합니다.


사이드바 메뉴와 기본 화면 만들기

먼저 구글시트 상단 메뉴에서 사이드바를 열 수 있도록 준비합니다. 여기서는 설정 상수와 메뉴, 사이드바 표시 함수까지를 한 번에 구성합니다. 이렇게 한 번 틀을 잡아 두면, 이후 다른 기능을 추가할 때도 같은 패턴을 반복해서 활용할 수 있습니다.

1단계 — 설정 상수와 메뉴, 사이드바 열기

이 코드는 스캔 결과를 쌓을 입고·출고·스캔로그 시트 이름과, 중복 스캔 방지 시간, 바코드 형식을 정규식으로 정의합니다. 그리고 구글시트 상단 ‘창고 도구’ 메뉴에 ‘스캔 입력창 열기’ 항목을 추가해 사이드바를 띄우는 역할을 합니다.

붙여넣을 위치: 구글시트 → 확장 프로그램 → Apps Script → Code.gs 맨 위에 추가합니다.

붙여넣은 뒤 할 일: 저장 후, 스크립트 편집기에서 onOpen을 한 번 실행해 권한을 승인합니다.

Apps Script (JavaScript)
// 설정 상수 — 여기만 본인 시트에 맞게 바꾸세요
const SCAN_CONFIG = {                                      // → 설정 묶음
  SHEET_INBOUND: '입고',                              // → 입고 시트 이름
  SHEET_OUTBOUND: '출고',                             // → 출고 시트 이름
  SCAN_LOG_SHEET: '스캔로그',                         // → 스캔 내역 시트
  CACHE_PREFIX: 'scan:',                             // → 바코드별 캐시 키 앞머리
  VALID_TYPES: ['INBOUND', 'OUTBOUND'],              // → 허용하는 입출고 유형
  DUP_SECONDS: 5,                                     // → 중복 판단 시간(초)
  BARCODE_REGEX: /^([A-Z0-9]{4})-([A-Z0-9]{4})$/,    // → 바코드 형식 예시
  TIMEZONE: 'America/New_York'                       // → 본인 창고 시간대로 바꾸세요
};

// 시트를 열 때 시리즈 공용 메뉴 '창고 도구'를 추가합니다
function onOpen() {                                   // → 시트 열릴 때 실행
  var menu = SpreadsheetApp.getUi()                   // → UI 객체 가져오기
    .createMenu('창고 도구');                         // → 메뉴는 하나만 만든다
  addScanMenu_(menu);                                 // → 이 편 항목 붙이기
  menu.addToUi();                                     // → 메뉴 표시
}

function addScanMenu_(menu) {                         // → 합칠 때는 이 함수만 부른다
  menu.addItem('스캔 입력창 열기', 'showScanSidebar'); // → 메뉴 항목 추가
}

// 사이드바를 표시합니다
function showScanSidebar() {                          // → 사이드바 열기 함수
  var html = HtmlService.createHtmlOutputFromFile('ScanSidebar') // → HTML 로드
    .setTitle('바코드 스캔 입력');                    // → 사이드바 제목
  SpreadsheetApp.getUi().showSidebar(html);           // → 사이드바 띄우기
}

동작 확인 방법: 구글시트를 새로고침했을 때 상단 메뉴에 ‘창고 도구’가 보이고, ‘스캔 입력창 열기’를 누르면 아직 내용이 없는 사이드바가 뜨면 기본 연결은 정상입니다.

여러 편을 한 프로젝트에 합칠 때: 앞 편 코드와 같은 Apps Script 프로젝트에 그냥 붙이면 onOpen()이 두 번 선언되어 나중 것만 살아남고 앞 편 메뉴가 사라집니다. 그래서 이 시리즈는 메뉴 이름을 창고 도구 하나로 통일하고, 각 편의 항목을 addScanMenu_(menu) 같은 도우미 함수로 떼어 두었습니다. 합칠 때는 이 편의 onOpen()만 지우고, 1편의 onOpen() 안에 addScanMenu_(menu); 한 줄만 더하면 됩니다. 그러면 창고 도구 메뉴 하나에 입고·출고·재고·랙 배치도·바코드 스캔·Load 서머리가 모두 모입니다. 시트 이름 상수(SHEET_INBOUND 등)처럼 여러 편에 똑같이 나오는 줄도 한 벌만 남기고 지우세요 — const는 같은 프로젝트에서 두 번 선언하면 그 자체로 오류입니다.


사이드바 HTML 화면 구성하기

이제 실제로 바코드를 입력받는 화면을 만듭니다. 이 부분은 HTML과 간단한 JavaScript로 구성되며, 바코드 입력칸·입출고 선택·수량·저장 버튼과 상태 메시지를 포함합니다. HID 방식 스캐너는 이 바코드 입력칸에 포커스가 있을 때 자동으로 코드를 채워 줍니다.

2단계 — 사이드바 HTML 화면 만들기

이 코드는 사이드바에 표시될 HTML입니다. 스캐너가 입력하는 칸과, 입·출고 선택, 수량 입력, 저장 버튼 그리고 처리 결과 표시 영역이 포함됩니다.

붙여넣을 위치: Apps Script 편집기 좌측에서 + → HTML → 파일명 ScanSidebar로 새 파일을 만들고, 아래 코드 전체로 교체합니다.

붙여넣은 뒤 할 일: 저장만 하면 됩니다.

HTML
<!-- ScanSidebar.html — 바코드 스캔 입력창 화면 -->
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <style>
      body { font-family: Arial, sans-serif; font-size: 13px; }
      label { display: block; margin-top: 8px; }
      input, select, button { width: 100%; box-sizing: border-box; }
      #status { margin-top: 8px; font-size: 12px; }
      .ok { color: green; }
      .err { color: red; }
    </style>
  </head>
  <body>
    <label>바코드</label>
    <input type="text" id="barcode" autofocus>

    <label>유형</label>
    <select id="type">
      <option value="INBOUND">입고</option>
      <option value="OUTBOUND">출고</option>
    </select>

    <label>수량</label>
    <input type="number" id="qty" value="1" min="1">

    <button id="saveBtn" style="margin-top:10px;">저장(Enter)</button>

    <div id="status"></div>

    <script>
      const barcodeInput = document.getElementById('barcode');
      const typeSelect = document.getElementById('type');
      const qtyInput = document.getElementById('qty');
      const saveBtn = document.getElementById('saveBtn');
      const statusDiv = document.getElementById('status');

      function showStatus(msg, ok) {
        statusDiv.textContent = msg;
        statusDiv.className = ok ? 'ok' : 'err';
      }

      function clearForm() {
        barcodeInput.value = '';
        qtyInput.value = 1;
        barcodeInput.focus();
      }

      function doSave() {
        const code = barcodeInput.value.trim();
        const type = typeSelect.value;
        const qty = parseInt(qtyInput.value, 10);

        if (!code) {
          showStatus('바코드를 스캔해 주세요.', false);
          barcodeInput.focus();
          return;
        }
        if (!qty || qty <= 0) {
          showStatus('수량은 1 이상 숫자여야 합니다.', false);
          qtyInput.focus();
          return;
        }

        saveBtn.disabled = true;
        showStatus('저장 중...', true);

        google.script.run
          .withSuccessHandler(function(res) {
            if (res.ok) {
              showStatus('저장 완료: ' + res.msg, true);
              clearForm();
            } else {
              showStatus('오류: ' + res.msg, false);
            }
            saveBtn.disabled = false;
          })
          .withFailureHandler(function(err) {
            showStatus('스크립트 오류: ' + err.message, false);
            saveBtn.disabled = false;
          })
          .onScanSubmit(code, type, qty);
      }

      // 버튼 클릭 시 저장
      saveBtn.addEventListener('click', function() {
        doSave();
      });

      // Enter 키로 저장
      barcodeInput.addEventListener('keydown', function(e) {
        if (e.key === 'Enter') {
          e.preventDefault();
          doSave();
        }
      });
    </script>
  </body>
</html>

동작 확인 방법: 구글시트에서 ‘바코드 스캔 → 스캔 입력창 열기’를 눌렀을 때, 우측에 바코드 입력칸·유형·수량·저장 버튼·상태 메시지가 보이면 화면 구성은 완료된 것입니다.


Apps Script로 검증·중복 방지·시트 기록 처리하기

이제 사이드바에서 넘어온 스캔 데이터를 Apps Script가 받아 처리하는 부분을 만듭니다. 이 단계에서 바코드 형식 검증, 구글시트 스캐너 중복방지 정규식, 입고·출고 시트 자동 입력, 스캔 로그 기록을 한 번에 구성합니다.

3단계 — 바코드 형식 검증과 파싱 함수 만들기

먼저 바코드가 사전에 정의한 규칙에 맞는지 검증하고, 필요한 경우 일부를 분리해서 쓰기 위한 파싱 함수를 만듭니다. 여기서는 예시로 AAAA-BBBB 형식(대문자·숫자 4글자-4글자)을 사용했습니다.

붙여넣을 위치: Code.gs에서 showScanSidebar 함수 아래쪽에 추가합니다.

붙여넣은 뒤 할 일: 저장 후, testParseBarcode 함수를 실행해 로그를 확인합니다.

Apps Script (JavaScript)
// 바코드 형식을 검증하고 컨테이너/모델을 분리합니다
function parseBarcode_(code) {
  var regex = SCAN_CONFIG.BARCODE_REGEX;
  var m = code.match(regex);
  if (!m) {
    throw new Error('잘못된 바코드 형식입니다. 예: ABCD-1234');
  }
  return {
    container: m[1],
    model: m[2]
  };
}

// 테스트용 예시 함수
function testParseBarcode() {
  var r = parseBarcode_('AB12-CD34');
  Logger.log(r);
}

동작 확인 방법: Apps Script 편집기에서 testParseBarcode를 선택해 실행한 뒤, 실행 로그에 {container=AB12, model=CD34}와 비슷한 값이 보이면 형식 검증과 파싱은 정상입니다.


4단계 — 중복 스캔 방지와 입·출고 시트 쓰기

이제 사이드바에서 호출하는 메인 함수에서 중복 스캔 방지와 시트 쓰기를 처리합니다. 여기서는 LockService로 동시 실행을 막고, CacheService.getScriptCache()로 일정 시간(SCAN_CONFIG.DUP_SECONDS) 내 같은 바코드가 다시 들어오면 저장을 막습니다. 여기서 getUserCache()가 아니라 getScriptCache()를 쓰는 것이 중요합니다. 사용자 캐시는 사람마다 따로 저장돼서, A 작업자가 찍은 바코드를 B 작업자가 곧바로 다시 찍어도 걸러지지 않습니다. 스크립트 캐시는 모든 작업자가 같은 값을 보기 때문에 여러 명이 함께 스캔하는 현장에서도 중복이 막힙니다. 그 뒤 입고·출고 시트와 스캔 로그 시트에 각각 한 줄씩 기록합니다.

중복 판정에서 두 가지를 특히 조심해야 합니다. 첫째, 마지막 바코드 하나만 기억하면 안 됩니다. A → B → A를 3초 안에 연달아 찍으면 마지막 기억이 B로 덮여 있어서 두 번째 A가 그대로 통과합니다. 그래서 아래 코드는 scan:바코드 형태로 바코드마다 따로 키를 만들고, 캐시 만료 시간(DUP_SECONDS)이 알아서 지워 주도록 맡깁니다. 둘째, 저장이 끝난 뒤에 표시를 남겨야 합니다. 바코드 형식이 틀렸거나 시트를 못 찾아 저장에 실패했는데 중복 표시만 남으면, 작업자가 곧바로 다시 찍었을 때 “중복”이라며 거부당하고 정작 한 줄도 안 들어갑니다. 그래서 cache.put은 시트 기록이 모두 끝난 맨 마지막에 둡니다.

유형(type) 값도 허용 목록으로 검사합니다. 검사가 없으면 OUTBOUND가 아닌 모든 값(오타·빈 값 포함)이 조용히 입고로 처리되어, 출고분이 입고 시트에 쌓이는 사고가 납니다.

붙여넣을 위치: parseBarcode_ 함수 아래쪽에 추가합니다.

붙여넣은 뒤 할 일: 입고, 출고, 스캔로그 시트를 미리 만들어 두고, testOnScanSubmit 함수를 실행해 테스트 데이터를 추가해 봅니다.

Apps Script (JavaScript)
// 스캔 입력을 최종 처리합니다
function onScanSubmit(code, type, qty) {
  var lock = LockService.getScriptLock();
  lock.waitLock(10000); // 최대 10초 대기
  try {
    code = String(code || '').trim();
    qty = Number(qty);

    if (!code) {
      return { ok: false, msg: '바코드가 비어 있습니다.' };
    }
    if (!qty || qty <= 0) {
      return { ok: false, msg: '수량은 1 이상 숫자여야 합니다.' };
    }
    if (SCAN_CONFIG.VALID_TYPES.indexOf(type) === -1) {   // → 유형 화이트리스트 검사
      return { ok: false, msg: '입출고 유형이 올바르지 않습니다: ' + type };
    }

    // 중복 스캔 방지 — 바코드마다 따로 기억한다
    var cache = CacheService.getScriptCache();       // → 모든 작업자가 함께 보는 캐시
    var cacheKey = SCAN_CONFIG.CACHE_PREFIX + code;  // → 이 바코드 전용 키
    var now = new Date();

    if (cache.get(cacheKey)) {                       // → 값이 남아 있으면 = 최근에 찍힘
      return { ok: false, msg: '중복 스캔으로 무시되었습니다.' };
    }

    // 바코드 파싱
    var parsed = parseBarcode_(code);
    var container = parsed.container;
    var model = parsed.model;

    // 공통 정보
    var tz = SCAN_CONFIG.TIMEZONE;
    var timeStr = Utilities.formatDate(now, tz, 'yyyy-MM-dd HH:mm:ss');
    var user = Session.getActiveUser().getEmail() || 'unknown';

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheetName = (type === 'OUTBOUND') ? SCAN_CONFIG.SHEET_OUTBOUND : SCAN_CONFIG.SHEET_INBOUND;
    var sheet = ss.getSheetByName(sheetName);
    if (!sheet) {
      throw new Error('시트를 찾을 수 없습니다: ' + sheetName);
    }

    // 입출고 시트에 한 줄 추가 (시간, 바코드, 컨테이너, 모델, 수량, 사용자)
    sheet.appendRow([
      timeStr,
      code,
      container,
      model,
      qty,
      user
    ]);

    // 스캔 로그 시트에도 기록
    var logSheet = ss.getSheetByName(SCAN_CONFIG.SCAN_LOG_SHEET);
    if (logSheet) {
      logSheet.appendRow([
        timeStr,
        code,
        type,
        qty,
        user
      ]);
    }

    // 여기까지 왔으면 저장이 끝난 것이다 — 그때 비로소 중복 방지 표시를 남긴다
    cache.put(cacheKey, String(now.getTime()), SCAN_CONFIG.DUP_SECONDS); // → N초 뒤 자동 소멸

    var msg = (type === 'OUTBOUND' ? '출고' : '입고') + ' ' + qty + '개';
    return { ok: true, msg: msg };

  } catch (e) {
    return { ok: false, msg: e.message };
  } finally {
    lock.releaseLock();
  }
}

// 테스트용: 임의 바코드로 저장 실행
function testOnScanSubmit() {
  var res = onScanSubmit('AB12-CD34', 'INBOUND', 3);
  Logger.log(res);
}

동작 확인 방법: 입고, 출고, 스캔로그 세 시트를 미리 만들어 두고 testOnScanSubmit을 실행했을 때, 입고스캔로그 시트 마지막 줄에 테스트 행이 추가되면 전체 처리 흐름이 정상입니다. 중복 방지는 같은 바코드로 testOnScanSubmit을 5초 안에 두 번 실행해 보면 확인됩니다 — 두 번째는 {ok=false, msg=중복 스캔으로 무시되었습니다.}가 로그에 찍히고 시트에는 줄이 늘지 않아야 합니다. 반대로 AB12-CD34CD34-AB12AB12-CD34 순서로 빠르게 찍으면 세 번째도 막혀야 정상입니다. 이후 사이드바에서 바코드를 입력해 실제 스캐너로도 동작을 확인할 수 있습니다.


실제 창고에서 적용할 때의 실무 팁

위 코드만으로도 창고관리 구글시트 바코드 기반의 최소한 입고·출고 자동 입력은 가능합니다. 다만 실제 현장에서 오래 운영하려면 몇 가지를 더 고려하는 것이 좋습니다.

첫째, 바코드 규칙을 조직 내에서 명확히 문서화해야 합니다. 예제에서는 단순히 컨테이너-모델 두 구간으로 나누었지만, 실제로는 보관위치-품목코드-로트번호처럼 세 구간 이상을 쓰는 경우가 많습니다. 이때는 SCAN_CONFIG.BARCODE_REGEX를 회사 규칙에 맞게 바꾸고, parseBarcode_에서 필요한 부분만 객체로 반환하도록 조정하면 됩니다. 형식이 정해져 있어야 나중에 입출고 데이터를 집계할 때 오류가 줄어듭니다.

둘째, 스캐너·앱 설정에서 스캔 후 자동 Enter 전송 옵션을 확인하는 것이 좋습니다. 많은 HID 방식 바코드 스캐너는 설명서에 Enter(캐리지 리턴) 추가용 설정 바코드가 포함되어 있습니다. 이를 한 번 읽히면, 작업자는 별도 키보드 조작 없이 스캔 → 자동 저장에 가까운 흐름으로 작업할 수 있습니다. 휴대폰 바코드 스캐너 앱도 일부는 동일한 옵션을 제공합니다.

셋째, 여러 사람이 동시에 스캔하는 환경에서는 이 글에서 사용한 LockService와 캐시 중복 방지만으로도 기본적인 충돌은 상당 부분 줄어듭니다. 다만 계산식이 복잡한 재고 시트와 스캔 입력 시트를 분리하는 것이 좋습니다. 예를 들어, 입고·출고·스캔로그 시트에는 원시 데이터만 쌓고, 재고 집계와 리포트는 별도 시트나 별도 문서에서 처리하는 구조입니다. 이런 구조는 구글시트 재고 자동 집계 방법 | Apps Script 3편과 자연스럽게 연결됩니다.

넷째, 실무에서 가장 자주 받는 질문 중 하나는 오입력 시 복구 방법입니다. 스캔로그 시트를 별도 두는 이유가 바로 이 지점입니다. 문제가 된 시간대의 로그만 필터링해, 잘못된 입고·출고 행을 조회하고 수기로 조정하거나, 필요하다면 로그를 기반으로 되돌리는 보정용 스크립트를 이후에 추가할 수 있습니다. 일단은 로그를 충분히 남기는 것이 첫 단계입니다.


설치 후 점검해야 할 부분과 흔한 오류

설치 과정에서 자주 발생하는 문제와 점검 포인트를 정리하면 다음과 같습니다. 이 부분은 실제 운영 전에 한 번씩 체크해 두면 시행착오를 줄일 수 있습니다.

첫째, 권한 승인 문제입니다. 사이드바에서 저장을 눌렀을 때 '스크립트 오류: Authorization is required' 또는 유사한 메시지가 보인다면 아직 Apps Script 권한을 승인하지 않은 상태입니다. 이때는 스크립트 편집기에서 onOpen이나 testOnScanSubmit 함수를 선택해 수동으로 한 번 실행하고, 화면에 뜨는 권한 요청 창에서 계정을 선택한 뒤 ‘고급 → (프로젝트 이름) 계속’을 눌러 승인합니다.

둘째, 파일명·시트명 불일치입니다. showScanSidebar에서 참조하는 HTML 파일명 ScanSidebar와 실제 HTML 파일명이 다르거나, SCAN_CONFIG.SHEET_INBOUND 등 시트 이름이 실제 시트 탭 이름과 다르면 오류가 발생합니다. 오류 메시지에 시트를 찾을 수 없습니다:라는 문구가 보이면 우선 설정 상수와 실제 시트 탭 이름을 다시 확인하는 것이 좋습니다.

셋째, 정규식과 실제 바코드 형식 불일치입니다. 계속해서 '잘못된 바코드 형식입니다. 예: ABCD-1234'가 나온다면, 사용하는 바코드 문자열이 예시 정규식과 다르다는 의미입니다. 이 경우 실제 바코드 한 줄을 복사해 두고, 그 패턴에 맞게 SCAN_CONFIG.BARCODE_REGEXparseBarcode_를 수정합니다. 예를 들어 LOC-ITEM-LOT처럼 세 구간일 때는 정규식을 세 그룹으로 나누고, 반환 객체에도 세 항목을 담도록 바꾸면 됩니다.

넷째, 스캐너가 Enter를 보내지 않는 경우입니다. 사이드바에서 바코드는 입력되지만 자동 저장이 되지 않고, Enter를 수동으로 눌러야만 저장된다면 스캐너 설정에서 Enter(또는 줄바꿈) 전송이 비활성화된 상태일 수 있습니다. 이 경우 사용 중인 스캐너·앱 설명서에서 Enter 추가 설정 방법을 확인한 뒤, 설정용 바코드를 스캔해 옵션을 변경하면 됩니다.


맺음말

이번 글에서는 구글시트 바코드 스캔 입력 만들기를 주제로, HID 방식 바코드 스캐너·앱을 활용해 구글시트 Apps Script 사이드바에서 바코드를 받고, 형식 검증·중복 방지·입고·출고 시트 기록·스캔 로그 저장까지 한 번에 처리하는 코드를 완성했습니다. 실제 창고 환경에서 바로 사용할 수 있는 수준을 목표로, 동시 실행 잠금과 오류 메시지 반환까지 포함해 최소한의 안전장치를 함께 구성했습니다.

바로 오늘 해볼 수 있는 행동으로는, 먼저 현재 사용하는 바코드 한 줄을 그대로 적어 보고 이번 예제의 SCAN_CONFIG.BARCODE_REGEXparseBarcode_를 자신의 형식에 맞게 수정해 보시기 바랍니다. 이 두 지점만 자기 회사 규칙에 맞춰 놓으면, 그다음부터는 스캐너를 연결해 사이드바에서 테스트하면서 자연스럽게 스캐너 → Enter → 자동 저장 흐름을 완성할 수 있습니다. 다음 편에서는 이 스캔 입력에 간단한 검색·검증 로직을 더해, 잘못된 위치나 품목을 사전에 차단하는 방법을 다룰 예정입니다.