Skip to content

Latest commit

 

History

History
195 lines (162 loc) · 7 KB

2_1.sheetsToMMS.md

File metadata and controls

195 lines (162 loc) · 7 KB

구글 스프레드시트로 MMS 발신 시스템 만들기

이 튜토리얼은 구글 스프레드시트를 이용하여 MMS 발신 시스템을 구축하는 방법을 안내합니다. 솔라피(Solapi) API를 통해 간편하게 SMS 또는 MMS를 발송할 수 있습니다.


1. 준비사항

  • 구글 계정
  • 솔라피(Solapi) 계정과 API 키

2. 구글 스프레드시트 설정

  1. 새 구글 스프레드시트를 엽니다.
  2. 메뉴에서 확장 프로그램 → Apps Script를 클릭하여 구글 앱스크립트 에디터를 엽니다.

3. 앱스크립트 코드 추가하기

앱스크립트 에디터에서 다음의 코드 파일을 생성합니다.

  • API 설정: 코드 최상단의 API_KEY, API_SECRET, SENDER_NUMBER에 솔라피에서 받은 API 정보를 입력합니다.

  • createNewSheet() 함수:

    • 새로운 시트를 생성하고 SMS 발송에 필요한 데이터를 입력하는 템플릿을 자동 생성합니다.
    • 헤더와 셀 형식, 데이터 유효성 검사를 자동으로 설정합니다.
  • sendToSolapi() 함수:

    • 솔라피 API를 통해 SMS를 발송하는 기능을 제공합니다.
  • sendSMS() 함수:

    • 스프레드시트의 데이터를 읽고 SMS 발송을 실행합니다.
    • 발송 상태와 발송 시간을 자동으로 기록합니다.
  • onOpen() 함수:

    • 스프레드시트 열릴 때 자동으로 메뉴를 추가하여 손쉽게 SMS 발송을 수행할 수 있도록 합니다.

4. 시스템 사용법

(1) 새 SMS 시트 생성

  • 스프레드시트를 열고 상단 메뉴의 SMS 발송 → 새 시트 만들기를 클릭하면 발송용 시트가 자동으로 생성됩니다.
  • 자동 생성된 시트에 수신번호, 수신자명, 메시지 내용을 작성합니다.

(2) SMS 발송

  • 메시지를 작성한 후, 메뉴에서 SMS 발송 → 선택한 연락처로 SMS 발송을 클릭합니다.
  • 발송이 완료되면 각 행의 '발송상태'와 '발송시간'이 자동으로 채워집니다.

5. 유의사항

  • 전화번호는 반드시 형식을 맞추어 입력해야 합니다 (예: 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();
}