이 튜토리얼은 구글 스프레드시트를 이용하여 MMS 발신 시스템을 구축하는 방법을 안내합니다. 솔라피(Solapi) API를 통해 간편하게 SMS 또는 MMS를 발송할 수 있습니다.
- 구글 계정
- 솔라피(Solapi) 계정과 API 키
- 새 구글 스프레드시트를 엽니다.
- 메뉴에서 확장 프로그램 → Apps Script를 클릭하여 구글 앱스크립트 에디터를 엽니다.
앱스크립트 에디터에서 다음의 코드 파일을 생성합니다.
-
API 설정: 코드 최상단의
API_KEY
,API_SECRET
,SENDER_NUMBER
에 솔라피에서 받은 API 정보를 입력합니다. -
createNewSheet() 함수:
- 새로운 시트를 생성하고 SMS 발송에 필요한 데이터를 입력하는 템플릿을 자동 생성합니다.
- 헤더와 셀 형식, 데이터 유효성 검사를 자동으로 설정합니다.
-
sendToSolapi() 함수:
- 솔라피 API를 통해 SMS를 발송하는 기능을 제공합니다.
-
sendSMS() 함수:
- 스프레드시트의 데이터를 읽고 SMS 발송을 실행합니다.
- 발송 상태와 발송 시간을 자동으로 기록합니다.
-
onOpen() 함수:
- 스프레드시트 열릴 때 자동으로 메뉴를 추가하여 손쉽게 SMS 발송을 수행할 수 있도록 합니다.
- 스프레드시트를 열고 상단 메뉴의
SMS 발송 → 새 시트 만들기
를 클릭하면 발송용 시트가 자동으로 생성됩니다. - 자동 생성된 시트에 수신번호, 수신자명, 메시지 내용을 작성합니다.
- 메시지를 작성한 후, 메뉴에서
SMS 발송 → 선택한 연락처로 SMS 발송
을 클릭합니다. - 발송이 완료되면 각 행의 '발송상태'와 '발송시간'이 자동으로 채워집니다.
- 전화번호는 반드시 형식을 맞추어 입력해야 합니다 (예:
010-1234-5678
또는01012345678
). - 발송 상태는 자동으로 기록되며, API 연동이 실패할 경우 메시지 내용을 통해 실패 이유를 확인할 수 있습니다.
이제 간단한 SMS/MMS 발신 시스템을 구글 스프레드시트에서 편리하게 관리하세요!
// 솔라피 API 설정
const API_KEY = 'YOUR_API_KEY';
const API_SECRET = 'YOUR_API_SECRET';
const SENDER_NUMBER = 'YOUR_SENDER_NUMBER';
// 구글 시트 생성 함수
function createNewSheet() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.insertSheet('SMS발송');
// 헤더 설정
const headers = [
['수신번호', '수신자명', '메시지내용', '발송상태', '발송시간']
];
// 헤더 스타일 설정 - 더 진한 파란색으로 변경
const headerRange = sheet.getRange(1, 1, 1, headers[0].length);
headerRange.setValues(headers);
headerRange.setBackground('#1a73e8'); // 더 진한 파란색
headerRange.setFontColor('white');
headerRange.setFontWeight('bold');
headerRange.setHorizontalAlignment('center'); // 가운데 정렬 추가
// 열 너비 설정
sheet.setColumnWidth(1, 150); // 수신번호
sheet.setColumnWidth(2, 100); // 수신자명
sheet.setColumnWidth(3, 300); // 메시지내용
sheet.setColumnWidth(4, 100); // 발송상태
sheet.setColumnWidth(5, 150); // 발송시간
// 전화번호 열 서식 설정 - 데이터 영역만 배경색 설정
const dataRange = sheet.getRange('A2:A1000');
dataRange
.setNumberFormat('@')
.setBackground('#f8f9fa'); // 더 연한 회색으로 변경
// 전화번호 형식 검증 규칙
const phoneRule = SpreadsheetApp.newDataValidation()
.requireFormulaSatisfied('=REGEXMATCH(TO_TEXT(A2), "^(010-?\\d{4}-?\\d{4})$")')
.setHelpText('올바른 휴대폰 번호 형식을 입력해주세요. (예: 010-1234-5678 또는 01012345678)')
.build();
dataRange.setDataValidation(phoneRule);
// 발송상태 열에 데이터 검증 추가
const statusRule = SpreadsheetApp.newDataValidation()
.requireValueInList(['대기중', '발송완료', '발송실패'], true)
.build();
sheet.getRange('D2:D1000').setDataValidation(statusRule);
// 첫 행 고정
sheet.setFrozenRows(1);
// 기본 상태 설정
sheet.getRange('D2:D1000').setValue('대기중');
// 테두리 설정 추가
headerRange.setBorder(true, true, true, true, true, true, 'black', SpreadsheetApp.BorderStyle.SOLID);
}
// Solapi API 호출 함수
function sendToSolapi(phone, message) {
const url = 'https://api.solapi.com/messages/v4/send';
const date = new Date().toISOString();
const payload = {
message: {
to: phone,
from: SENDER_NUMBER,
text: message
}
};
// API 인증을 위한 헤더 생성
const salt = Math.random().toString(36).substring(2, 15);
const signature = Utilities.computeHmacSha256Signature(
`${date}${salt}`,
API_SECRET
).map(byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
const options = {
method: 'post',
muteHttpExceptions: true,
headers: {
'Authorization': `HMAC-SHA256 apiKey=${API_KEY}, date=${date}, salt=${salt}, signature=${signature}`,
'Content-Type': 'application/json'
},
payload: JSON.stringify(payload)
};
const response = UrlFetchApp.fetch(url, options);
const responseData = JSON.parse(response.getContentText());
if (response.getResponseCode() !== 200) {
throw new Error(`API Error: ${responseData.errorMessage}`);
}
return responseData;
}
// SMS 발송 함수
function sendSMS() {
const sheet = SpreadsheetApp.getActiveSheet();
const lastRow = sheet.getLastRow();
if (lastRow < 2) {
SpreadsheetApp.getUi().alert('발송할 데이터가 없습니다.');
return;
}
const data = sheet.getRange(2, 1, lastRow - 1, 3).getValues();
let successCount = 0;
let failCount = 0;
data.forEach((row, index) => {
const [phone, name, message] = row;
if (!phone) return;
// 전화번호 형식 정리 (하이픈 제거)
const cleanPhone = phone.toString().replace(/-/g, '');
try {
const response = sendToSolapi(cleanPhone, message);
sheet.getRange(index + 2, 4).setValue('발송완료');
sheet.getRange(index + 2, 5).setValue(new Date().toLocaleString());
successCount++;
} catch (error) {
sheet.getRange(index + 2, 4).setValue('발송실패');
sheet.getRange(index + 2, 5).setValue(error.message);
failCount++;
console.error(`발송 실패 (${cleanPhone}): ${error.message}`);
}
});
const message = `SMS 발송이 완료되었습니다.\n\n` +
`성공: ${successCount}건\n` +
`실패: ${failCount}건`;
SpreadsheetApp.getUi().alert(message);
}
// 커스텀 메뉴 생성
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('SMS 발송')
.addItem('새 시트 만들기', 'createNewSheet')
.addItem('선택한 연락처로 SMS 발송', 'sendSMS')
.addToUi();
}