소개
호기롭게 시작했으나 일이 바쁘다는 핑계로 작업과 사례글 작성이 늦어졌네요. ;_;
지금부터 작성해보겠습니다!
[목표 업무]
기존 google sheet에 작성된 포멧 -> json으로 만들기
완료
진행 방법
기존 작업에 이어서 시작을 해보려 합니다.
이 코드 제대로 된건지, 어떻게 수정을 해야 하는지를 물어봤습니다.
한국 웹 사이트의 스크린 샷
이 내용으로 가져가서 앱스스크립트에서 작업을 하다 보니까 언어를 직접 입력해야하는 번거로움이 있더라고요. 하여 조금 더 자동화 할 수 있는 부분이 없을까 싶어서 물어보니 아래처럼 추천을 해주더라고요.
이렇게 되면 꿀인데.. 되려나요? 정리된 내용은 아래와 같습니다.
이야기할 수록 필요없는 기능/작업을 하려고 해서 제한을 많이 해야 했습니다.
좋아요, 로케일별 JSON만 생성하도록 최소 구성으로 정리했습니다.(번역/폴백/가공 없음, Note/updated_at 제외)
전제
시트명: translations헤더: key, note(선택), updated_at(선택), 이 후는 전부 로케일 컬럼(ko, en, en-asia, es-es 등)
결과 예
ko.json → { "home.title": "집", "home.subtitle": "어서 오세요", ... }en-asia.json → { "home.title": "Home", ... }메타(note, updated_at)는 포함하지 않습니다.
Apps Script (복붙)
확장 프로그램 → Apps Script에 붙여 넣고 savePerLocaleJsonsToDrive() 실행
/** CONFIG **/
const PROP = PropertiesService.getScriptProperties();
const SLACK_WEBHOOK = PROP.getProperty('SLACK_WEBHOOK');
const JSON_FOLDER_ID = PROP.getProperty('JSON_FOLDER_ID');
/** 메인: 시트 → JSON 생성 및 드라이브 저장 */
function generateJson() {
const sheet = SpreadsheetApp.getActive().getSheetByName('translations');
const data = sheet.getDataRange().getValues();
const header = data.shift();
const idx = Object.fromEntries(header.map((h, i) => [String(h).trim(), i]));
const obj = {};
data.forEach(row => {
const key = row[idx.key];
if (!key) return;
obj[key] = {
ko: row[idx.ko] ?? '',
en: row[idx.en] ?? '',
note: row[idx.note] ?? ''
};
});
const jsonText = JSON.stringify(obj, null, 2);
const fileId = saveJson(jsonText);
postToSlack({
text: `✅ JSON 생성 완료 — ${Object.keys(obj).length}개 키`,
blocks: [
{ type: 'section', text: { type: 'mrkdwn', text: `*JSON 생성 완료* (키 ${Object.keys(obj).length}개)` } },
{ type: 'context', elements: [ { type: 'mrkdwn', text: `파일 ID: ${fileId}` } ] }
]
});
return jsonText;
}
/** 드라이브에 JSON 저장 */
function saveJson(jsonText) {
const tz = Session.getScriptTimeZone();
const name = `translations_${Utilities.formatDate(new Date(), tz, 'yyyyMMdd_HHmmss')}.json`;
let file;
if (JSON_FOLDER_ID) {
const folder = DriveApp.getFolderById(JSON_FOLDER_ID);
file = folder.createFile(name, jsonText, MimeType.JSON);
} else {
file = DriveApp.createFile(name, jsonText, MimeType.JSON);
}
return file.getId();
}
/** 셀 수정 시 변경 감지 및 슬랙 알림 */
function onEdit(e) {
try {
if (!e) return;
const sheet = e.source.getActiveSheet();
if (sheet.getName() !== 'translations') return;
const row = e.range.getRow();
const col = e.range.getColumn();
if (row === 1) return; // 헤더 제외
const key = sheet.getRange(row, 1).getValue();
const header = sheet.getRange(1, col).getValue();
const newVal = e.value;
const oldVal = e.oldValue; // 단일 셀 수정 시에만 존재
postToSlack({
text: `✏️ 변경: ${key}`,
blocks: [
{ type: 'section', text: { type: 'mrkdwn', text: `*${sheet.getName()}* — R${row}C${col} • *${key}*` } },
{ type: 'section', fields: [
{ type: 'mrkdwn', text: `*컬럼*\n${header}` },
{ type: 'mrkdwn', text: `*셀*\nR${row}C${col}` }
] },
{ type: 'section', fields: [
{ type: 'mrkdwn', text: `*이전*\n\`${oldVal ?? '(없음)'}\`` },
{ type: 'mrkdwn', text: `*변경*\n\`${newVal ?? '(삭제)'}\`` }
] }
]
});
} catch (err) {
postToSlack({ text: `⚠️ onEdit 오류: ${err.message}` });
}
}
/** Slack 웹훅으로 메시지 전송 */
function postToSlack(payload) {
if (!SLACK_WEBHOOK) throw new Error('SLACK_WEBHOOK 스크립트 속성을 설정하세요.');
const res = UrlFetchApp.fetch(SLACK_WEBHOOK, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true,
});
return res.getResponseCode();
}사용법까지 친절하게 알려주네요. 도전도전!!
사용 방법
시트 헤더 확인: key / note / updated_at / ko / en ...
스크립트 붙여넣기 → savePerLocaleJsonsToDrive() 실행
Google Drive의 i18n-exports 폴더에서 로케일별 *.json 확인
내용을 계속 필요없이 업그레이드 해줘서 ㅋㅋ 제외를 여러번 시켜봅니다.
번역은 필요 없고 json 화를 해줘야해. 번역 작업은 제외해줘.* 로케일별 JSON:만 추려줄래?그 외에도 아주 기초적인 내용부터 질문을 했어요.
function myFunction() {
}
붙여넣기 하려는데 이게 있어, 지우고 넣어? 아니면 저 사이에 넣어?지우고 넣으래서..
지우고 넣었어 , 이 다음에 어떻게 하면 돼?ㅋㅋㅋ 이정도까지 하나하나 물으면서 해내었답니다.
잘했다고 해서 실행 시도를 해봅니다.!!!!
한국어 텍스트가있는 검은 색 화면
실행하니 바로 에러가 납니다.... (된거라며....ㅋㅋㅋ)
뭐 그럴 수 있죠,,, 나는 1도 모르는 걸 해주는데 고마워해야죠.. 채찍피티야 고마어!~!!!ㅋㅋ
에러에 대해 물어봐봅니다.,, 이런 저런 상의를 하기 위해 그냥 싹 긁어넣기!!
한국 웹 사이트의 스크린 샷
아주 잘 고쳐주네요!!
남의 작업에 실행 버튼만 눌러보다 제가 직접 만들어보니 감회가 새롭습니다.
그래서 결과값은??
두구두구두구두구..
항목 목록을 보여주는 웹 페이지의 스크린 샷
크아.. 폴더도 잘 만들고,, 다 저장이 되었습니다.!
저 18색..개의 언어..잘 만들어졌네요.
체크 하고 싶은 건 이제 더 있는데 일단 저장..하고 더 쓸게요.ㅋㅋㅋㅋㅋ (제이님,, 드라마같죠??)ㅋㅋㅋ
일단 목표는 여기까지 였으므로...
만들어진 기능 확인하기
결과를 알려주고 추가적으로 작업된 기능과 활용방법을 물어봅니다.
보라색 배경이있는 한국 웹 사이트의 스크린 샷
많은 기능을 해줬군요.
파일도 열어봤는데 잘 나옵니다.ㅜㅜ 감동이야..
결과와 배운 점
다른 이가 만든 앱스스크립트 딸깍만 하다보니 제가 앱스스크립트를 한다고 착각했었는데 이번 기회에 직접 만들어보니 기분이 몹시 좋네요.
수정도 잘해주는 지피티 넘 고마워!!
내가 원하는 스펙 이상을 해주려고 하고, 소스코드를 길게 만들어줘서 고마우면서도 힘들었는데
다음번에도 잘 만들 수 있을 자신감을 얻었고 회사 생활에 야근을 줄이는 데 몹시 도움이 될 거 같습니다.