프로그램 (PHP,Python)

Google Apps Script 활용한 메일 자동화, AI 슬랫봇 만들기

날으는물고기 2024. 11. 18. 00:50

메일 자동화를 위한 수신 메일 분류 및 특정 키워드 기반 액션 워크플로우 수행을 위한 기반 환경을 구성하려면 Google Workspace의 다양한 도구를 활용해야 합니다. 이 작업은 주로 Google Apps Script와 Gmail 필터, Google Drive, Google Sheets 등을 활용하여 이루어질 수 있습니다. 다음은 이 작업을 수행하는 단계별 가이드입니다.

1. Gmail 필터 설정

Gmail에서 특정 키워드나 조건에 맞는 메일을 자동으로 분류하기 위해 필터를 설정해야 합니다.

1.1 필터 생성

  1. Gmail 열기: Gmail을 열고, 상단 검색창 오른쪽에 있는 화살표를 클릭합니다.
  2. 조건 입력: 예를 들어, 메일 제목에 "invoice"가 포함된 메일을 분류하고 싶다면, "Subject" 필드에 invoice를 입력합니다.
  3. 필터 생성: 조건을 입력한 후 "필터 만들기"를 클릭합니다.
  4. 액션 선택: 필터가 적용될 메일에 대한 액션을 선택합니다. 예를 들어, "라벨 적용"을 선택하여 "Invoice" 라벨을 적용할 수 있습니다.
  5. 필터 저장: "필터 만들기"를 클릭하여 저장합니다.

이 필터는 설정한 조건에 맞는 메일을 자동으로 분류합니다.

2. Google Apps Script로 워크플로우 자동화

Google Apps Script를 사용하여 특정 라벨이 적용된 메일을 트리거로 하여, 워크플로우를 수행하는 스크립트를 작성할 수 있습니다.

2.1 Google Apps Script 프로젝트 생성

  1. Google Apps Script 열기: Google Drive에서 새 Google 스프레드시트를 생성하고, Extensions(확장 기능) > Apps Script를 선택합니다.
  2. 스크립트 작성: 다음 코드를 스크립트 편집기에 붙여넣습니다.
    function processLabelledEmails() {
      // 처리할 라벨 이름 설정 (예: "Invoice")
      var labelName = 'Invoice';
      var label = GmailApp.getUserLabelByName(labelName);
    
      if (label) {
        // 해당 라벨이 적용된 메일 스레드 가져오기
        var threads = label.getThreads();
    
        // 각 스레드에 대해 액션 수행
        for (var i = 0; i < threads.length; i++) {
          var messages = threads[i].getMessages();
    
          for (var j = 0; j < messages.length; j++) {
            var message = messages[j];
    
            // 첨부 파일이 있는지 확인하고 처리
            var attachments = message.getAttachments();
            if (attachments.length > 0) {
              // Google 드라이브에 파일 저장
              var folder = DriveApp.getFolderById('YOUR_FOLDER_ID'); // 폴더 ID 수정 필요
              for (var k = 0; k < attachments.length; k++) {
                var file = folder.createFile(attachments[k]);
                // 추가 작업을 원할 경우 여기에 작성 (예: 파일 이름 변경)
                file.setName('Invoice-' + new Date().toISOString() + '-' + attachments[k].getName());
              }
            }
    
            // 이메일을 Google Sheets에 기록
            var sheet = SpreadsheetApp.openById('YOUR_SHEET_ID').getSheetByName('Invoices');
            sheet.appendRow([message.getFrom(), message.getSubject(), new Date()]);
    
            // 이후 다른 워크플로우 동작 추가 가능 (예: 특정 API 호출, 다른 시스템과 연동 등)
          }
    
          // 라벨 제거 또는 다른 라벨로 변경 (원하는 경우)
          // threads[i].removeLabel(label);
        }
      }
    }

2.2 트리거 설정

  1. 트리거 추가: 스크립트 편집기에서 Triggers(트리거) > Add Trigger(트리거 추가)를 선택합니다.
  2. 트리거 구성: processLabelledEmails 함수를 선택하고, 시간 기반 트리거를 설정하여 주기적으로 실행되도록 설정합니다.

3. 워크플로우 확장

Google Apps Script는 다양한 Google 서비스와 연동이 가능하기 때문에, 다음과 같은 추가적인 워크플로우를 구성할 수 있습니다.

  • Slack 알림: 특정 키워드가 포함된 메일을 수신하면, Slack에 알림을 보낼 수 있습니다.
  • Google Sheets 업데이트: 메일 정보를 Google Sheets에 자동으로 기록하여 트래킹할 수 있습니다.
  • API 호출: 특정 이메일을 수신하면 외부 API를 호출하여 시스템 간 연동을 수행할 수 있습니다.

예를 들어, 특정 키워드가 포함된 메일 수신 시 Slack에 알림을 보내는 코드 예시는 다음과 같습니다.

function sendSlackNotification(message) {
  var webhookUrl = 'YOUR_SLACK_WEBHOOK_URL'; // Slack Webhook URL
  var payload = {
    text: 'New Invoice Email Received:\n' +
          'From: ' + message.getFrom() + '\n' +
          'Subject: ' + message.getSubject()
  };
  var options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };
  UrlFetchApp.fetch(webhookUrl, options);
}

이 코드는 processLabelledEmails 함수 내에서 호출하여 사용할 수 있습니다.

4. 테스트 및 검증

  1. 스크립트 테스트: 스크립트를 수동으로 실행하여 정상적으로 동작하는지 확인합니다. 특정 라벨이 적용된 메일에 대해 예상되는 액션이 수행되는지 확인합니다.
  2. 트리거 동작 확인: 트리거가 설정된 시간이 되었을 때 스크립트가 자동으로 실행되어 워크플로우가 올바르게 작동하는지 확인합니다.

5. 유지 보수 및 최적화

자동화된 워크플로우는 시간이 지남에 따라 변경될 수 있는 비즈니스 요구 사항에 맞게 유지 관리하고 최적화해야 합니다. 주기적으로 스크립트를 리뷰하고 필요한 변경 사항을 적용하여 시스템을 최적의 상태로 유지하는 것이 중요합니다.

 

이와 같이 Gmail 메일 분류와 특정 키워드 기반의 워크플로우 자동화를 위한 기반 환경을 구성하는 방법입니다. 이 프로세스를 활용하여 반복적인 작업을 자동화하고, 시간과 자원을 절약할 수 있습니다. Gmail로 수신된 특정 패턴의 메일에 첨부된 파일을 Google 드라이브의 특정 폴더에 자동으로 업로드하는 방법은 Google Apps Script를 사용하여 구현할 수 있습니다. 다음은 이 작업을 수행하는 단계별 가이드입니다.

1. Google Apps Script 환경 설정

  1. Google Apps Script 프로젝트 생성
    • Google 드라이브에서 새 Google 스프레드시트를 생성합니다.
    • Extensions(확장 기능) > Apps Script를 선택하여 스크립트 편집기를 엽니다.
  2. 스크립트 작성
    • 다음 코드를 스크립트 편집기에 복사하여 붙여넣습니다.
    function getGmailAttachments() {
      // 검색할 이메일 패턴 설정 (예: 제목에 "invoice"가 포함된 이메일)
      var searchQuery = 'subject:invoice has:attachment';
      // 특정 Google 드라이브 폴더 ID 설정
      var folderId = 'YOUR_FOLDER_ID'; // 여기 YOUR_FOLDER_ID를 Google 드라이브 폴더 ID로 변경
    
      // 이메일 검색
      var threads = GmailApp.search(searchQuery);
      var folder = DriveApp.getFolderById(folderId);
    
      // 이메일 스레드 처리
      for (var i = 0; i < threads.length; i++) {
        var messages = threads[i].getMessages();
    
        for (var j = 0; j < messages.length; j++) {
          var attachments = messages[j].getAttachments();
    
          // 첨부 파일 드라이브 폴더에 저장
          for (var k = 0; k < attachments.length; k++) {
            var attachment = attachments[k];
            folder.createFile(attachment);
          }
        }
      }
    }

2. 코드 실행 트리거 설정

  1. 트리거 설정
    • 스크립트 편집기에서 Triggers(트리거) > Add Trigger(트리거 추가)를 선택합니다.
    • getGmailAttachments 함수를 선택하고, 시간 기반 트리거(예: 매시간)를 설정하여 주기적으로 스크립트가 실행되도록 합니다.

3. 권한 승인

  1. 권한 승인
    • 스크립트를 처음 실행할 때 Google 계정에 대한 권한을 요청합니다. 해당 권한을 승인해야 스크립트가 Gmail과 Google 드라이브에 접근할 수 있습니다.

4. 테스트 및 검증

  1. 테스트
    • 스크립트를 실행하여 정상적으로 동작하는지 확인합니다. 설정한 검색 쿼리(예: subject:invoice)에 해당하는 이메일에서 첨부 파일을 가져와 Google 드라이브의 특정 폴더에 업로드하는지 확인합니다.

이 스크립트는 Gmail에서 특정 패턴을 검색하고, 해당 이메일의 첨부 파일을 Google 드라이브 폴더에 저장하는 기본적인 자동화 작업을 수행합니다. 필요에 따라 검색 쿼리와 폴더 ID를 조정하여 원하는 결과를 얻을 수 있습니다.

 

추가로, 이 스크립트를 더 발전시키려면 에러 핸들링이나 로그 기록 등을 추가하여 스크립트의 안정성을 높일 수 있습니다. Google Apps Script를 활용하여 최신 기준으로 Slack Bot을 만드는 방법입니다. Slack API와 Google Apps Script는 시간이 지나면서 업데이트되었을 수 있으니 최신 내용을 반영하여 진행합니다.

1. Google Apps Script 프로젝트 생성

  1. Google Drive에서 새 프로젝트 생성
    • Google Drive에 접속하고 왼쪽 상단의 "새로 만들기" 버튼을 클릭한 후 "Google Apps Script"를 선택합니다.
    • Apps Script 편집기가 열리면 새로운 프로젝트를 생성할 수 있습니다.
  2. Slack 이벤트 인증을 위한 코드 작성
    function doPost(e) {
      return ContentService.createTextOutput(JSON.parse(e.postData.contents).challenge);
    }
    • 위 코드는 Slack이 보낸 challenge 값을 반환하여 Slack에서 웹훅을 인증할 수 있게 하는 코드입니다.
  3. 웹 앱으로 배포
    • 메뉴에서 "Deploy" -> "Test deployments"로 이동한 뒤 웹 앱으로 배포합니다.
    • 배포 팝업에서 "Anyone", "Execute as me" 옵션을 선택하고 배포합니다.
    • Current web app URL을 복사해두세요. 이 URL은 나중에 Slack의 이벤트 서브스크립션 설정에서 필요합니다.

2. Slack App 생성

  1. Slack API에서 새로운 앱 생성
    • Slack API에 접속하여 "Create New App" 버튼을 클릭합니다.
    • 앱 이름과 연결할 워크스페이스를 선택합니다.
  2. Event Subscriptions 활성화
    • Slack 앱의 "Event Subscriptions" 섹션으로 이동하여 "Enable Events" 스위치를 켭니다.
    • Request URL에 앞서 복사해둔 Google Apps Script의 웹 앱 URL을 붙여넣습니다.
    • Slack에서 이 URL을 통해 이벤트 서브스크립션 인증을 수행하고, 인증이 완료되면 "Verified"가 표시됩니다.
  3. Bot 이벤트 구독
    • Subscribe to bot events에서 message.channels를 추가하여 메시지 이벤트를 구독합니다. 이로 인해 Slack 채널에 메시지가 발생하면 Apps Script로 이벤트가 전달됩니다.

3. OAuth & Permissions 설정

  1. Bot 권한 설정
    • OAuth & Permissions로 이동하여 Scopes 섹션에서 channels:history, reactions:write 등의 필요한 권한을 추가합니다.
    • 각 기능에 맞는 권한을 추가할 수 있습니다.
  2. 워크스페이스에 앱 설치
    • Install App to Workspace 버튼을 클릭하여 워크스페이스에 앱을 설치하고, Bot User OAuth Access Token을 복사합니다. 이 토큰은 Slack API와 통신할 때 사용됩니다.

4. Apps Script 코드 수정

  1. Slack 메시지 이벤트 처리
    • Apps Script로 돌아가서 아래 코드를 작성합니다. Slack으로부터 받은 이벤트 데이터를 바탕으로 특정 메시지에 체크 표시 이모지를 추가하는 예제입니다.
      function doPost(e) {
          var token = "여기에 OAuth 토큰을 입력하세요";
          var contents = JSON.parse(e.postData.contents);
      
          if (contents.event && contents.event.text) {
            var option = {
              'method': 'post',
              'payload': {
                'token': token,
                'channel': contents.event.channel,
                'timestamp': contents.event.ts,
                'name': "heavy_check_mark"
              }
            };
            UrlFetchApp.fetch("https://slack.com/api/reactions.add", option);
          }
      }
    • 이 코드는 메시지 이벤트가 발생할 때 해당 메시지에 체크 이모지를 추가합니다.
    • token 변수에는 앞서 복사한 Bot User OAuth Access Token을 넣어주세요.
  2. 다시 배포
    • 변경된 코드로 다시 배포합니다. "Deploy" 메뉴에서 "Test deployments"를 통해 새로운 배포를 설정합니다.

5. Slack에서 Bot 테스트

  1. Slack 채널에 앱 추가
    • Slack의 채널에 방금 만든 앱을 추가합니다. 테스트 채널을 만들고 "Add Apps" 버튼을 통해 앱을 검색해 추가합니다.
  2. 테스트
    • 테스트 채널에 메시지를 보내봅니다. 메시지가 전송되면 Slack Bot이 해당 메시지에 체크 이모지를 추가하는지 확인합니다.

6. 추가 기능 구현

  1. 메시지 내용을 분석해 작업 수행
    • 특정 키워드가 포함된 메시지를 감지하고 그에 따라 작업을 수행할 수 있도록 코드를 확장할 수 있습니다.
      function doPost(e) {
          var token = "여기에 OAuth 토큰을 입력하세요";
          var contents = JSON.parse(e.postData.contents);
      
          if (contents.event && contents.event.text) {
            if (contents.event.text.includes("something")) {
              // 특정 메시지를 감지하고 작업 수행
            }
      
            var option = {
              'method': 'post',
              'payload': {
                'token': token,
                'channel': contents.event.channel,
                'timestamp': contents.event.ts,
                'name': "heavy_check_mark"
              }
            };
            UrlFetchApp.fetch("https://slack.com/api/reactions.add", option);
          }
      }

이 과정을 통해 Slack과 Google Apps Script를 활용한 Slack Bot을 만들 수 있습니다. GPT API를 활용하여 질문을 받아 그 답변을 Slack에 자동으로 댓글로 기록하는 Slack Bot을 Google Apps Script로 구현하는 방법입니다.

1. 프로젝트 설정

1.1 GPT API 준비

1.2 Google Apps Script 프로젝트 생성

  1. Google Drive에서 "새로 만들기" -> "Google Apps Script"를 클릭하여 새 프로젝트를 만듭니다.
  2. 프로젝트 이름을 "Slack GPT Bot"으로 설정합니다.

2. Google Apps Script 코드 작성

2.1 기본 코드

Slack에서 질문을 받아 GPT API로 질문을 전달하고, 그 답변을 Slack에 댓글로 남기는 코드입니다.

// GPT API를 호출하는 함수
function callGptApi(question) {
  var apiKey = '여기에-OpenAI-API-키를-입력하세요';
  var url = 'https://api.openai.com/v1/completions';

  var payload = {
    'model': 'text-davinci-003',  // 사용할 GPT 모델
    'prompt': question,  // 사용자 질문
    'max_tokens': 100,  // 응답 길이
    'temperature': 0.7  // 출력의 무작위성 조정
  };

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      'Authorization': 'Bearer ' + apiKey
    },
    'payload': JSON.stringify(payload)
  };

  var response = UrlFetchApp.fetch(url, options);
  var json = JSON.parse(response.getContentText());
  return json.choices[0].text.trim();  // GPT 응답 반환
}

// Slack 메시지를 수신하고 GPT API로 처리한 후 답변을 댓글로 달아주는 함수
function doPost(e) {
  var token = "여기에-Slack-Bot-User-OAuth-Access-Token-을-입력하세요";
  var contents = JSON.parse(e.postData.contents);

  if (contents.event && contents.event.text) {
    var question = contents.event.text;  // Slack에서 받은 질문

    // GPT API 호출
    var gptAnswer = callGptApi(question);

    // Slack에 댓글로 답변 달기
    var postPayload = {
      'token': token,
      'channel': contents.event.channel,
      'thread_ts': contents.event.ts,  // 스레드에 댓글 달기 위한 타임스탬프
      'text': gptAnswer  // GPT에서 받은 답변
    };

    var postOptions = {
      'method': 'post',
      'payload': postPayload
    };

    UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", postOptions);
  }

  return ContentService.createTextOutput("OK");
}

3. 코드 설명

  1. GPT API 호출
    • callGptApi 함수는 OpenAI의 GPT API에 질문을 전달하고, GPT의 응답을 받아 반환합니다.
    • max_tokens는 응답의 최대 길이를 조정하며, temperature는 출력의 무작위성을 조절합니다.
  2. Slack 메시지 처리
    • Slack에서 메시지를 받을 때 doPost 함수가 호출됩니다. 이 함수는 Slack에서 받은 메시지(질문)를 추출하고 GPT API로 전달한 후 답변을 받습니다.
    • Slack 메시지 이벤트에서 받은 channeltimestamp를 사용하여, 받은 메시지에 대한 스레드 댓글로 GPT의 응답을 답니다.
  3. Slack에 답변 댓글 작성
    • chat.postMessage Slack API를 사용하여 해당 메시지 스레드에 GPT의 응답을 댓글로 달아줍니다. 이를 위해 thread_ts 값을 사용하여 특정 메시지에 스레드 형태로 응답이 달리도록 합니다.

4. Slack과 Google Apps Script 연동

4.1 Slack App 생성 및 설정

  1. Slack API에서 새로운 앱을 생성합니다.
  2. Event Subscriptions을 활성화하고, Request URL에 Google Apps Script 웹 앱 URL을 설정합니다.
    • Google Apps Script에서 웹 앱으로 배포한 URL을 여기에 입력합니다.
  3. Subscribe to bot eventsmessage.channels를 추가하여 메시지 이벤트를 구독합니다.

4.2 Slack App 권한 설정

  1. OAuth & Permissions 섹션에서 chat:write 권한을 부여합니다.
  2. Install App to Workspace 버튼을 눌러 Slack 워크스페이스에 앱을 설치하고, Bot User OAuth Access Token을 복사하여 코드에 삽입합니다.

4.3 Google Apps Script 배포

  1. Google Apps Script 프로젝트에서 Deploy -> Test deployments -> 웹 앱으로 배포합니다.
  2. 배포가 완료되면 Current web app URL을 복사하여 Slack의 Request URL에 붙여넣습니다.

5. 테스트

  1. Slack에서 앱을 추가한 채널에 질문을 입력해보세요.
  2. Google Apps Script가 해당 질문을 GPT API로 전달하고, Slack에 GPT 답변을 댓글로 남기는지 확인합니다.

Slack에서 질문을 받아 GPT API로 처리하고, 그 답변을 댓글로 자동 기록하는 Slack Bot이 완성됩니다.

Gemini API를 활용하여 질문을 받고 그 답변을 Slack에 댓글로 기록하는 방법입니다. Google Apps Script를 활용하여 기존의 OpenAI GPT API 대신 Gemini API를 사용하는 방식으로 코드를 업데이트합니다.

1. 프로젝트 설정

1.1 Gemini API 준비

  • Gemini API를 사용하기 위해 계정을 만들고 API 키를 발급받아야 합니다. (구체적인 Gemini API 사이트는 공식적으로 참조해주셔야 합니다.)
  • 발급받은 API 키를 복사해둡니다.

1.2 Google Apps Script 프로젝트 생성

  1. Google Drive에서 "새로 만들기" -> "Google Apps Script"를 클릭하여 새 프로젝트를 만듭니다.
  2. 프로젝트 이름을 "Slack Gemini Bot"으로 설정합니다.

2. Google Apps Script 코드 작성

2.1 기본 코드

Slack에서 질문을 받아 Gemini API로 질문을 전달하고, 그 답변을 Slack에 댓글로 남기는 코드입니다.

// Gemini API를 호출하는 함수
function callGeminiApi(question) {
  var apiKey = '여기에-Gemini-API-키를-입력하세요';
  var url = 'https://api.gemini.com/v1/completions';  // Gemini API의 엔드포인트, 공식 문서에서 확인 필요

  var payload = {
    'model': 'text-gemini-001',  // 사용할 Gemini 모델, 모델명은 Gemini API 문서를 참조
    'prompt': question,  // 사용자 질문
    'max_tokens': 100,  // 응답의 최대 토큰 수
    'temperature': 0.7  // 출력의 무작위성 조절
  };

  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'headers': {
      'Authorization': 'Bearer ' + apiKey
    },
    'payload': JSON.stringify(payload)
  };

  var response = UrlFetchApp.fetch(url, options);
  var json = JSON.parse(response.getContentText());
  return json.choices[0].text.trim();  // Gemini 응답 반환
}

// Slack 메시지를 수신하고 Gemini API로 처리한 후 답변을 댓글로 달아주는 함수
function doPost(e) {
  var token = "여기에-Slack-Bot-User-OAuth-Access-Token-을-입력하세요";
  var contents = JSON.parse(e.postData.contents);

  if (contents.event && contents.event.text) {
    var question = contents.event.text;  // Slack에서 받은 질문

    // Gemini API 호출
    var geminiAnswer = callGeminiApi(question);

    // Slack에 댓글로 답변 달기
    var postPayload = {
      'token': token,
      'channel': contents.event.channel,
      'thread_ts': contents.event.ts,  // 스레드에 댓글 달기 위한 타임스탬프
      'text': geminiAnswer  // Gemini에서 받은 답변
    };

    var postOptions = {
      'method': 'post',
      'payload': postPayload
    };

    UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", postOptions);
  }

  return ContentService.createTextOutput("OK");
}

3. 코드 설명

  1. Gemini API 호출
    • callGeminiApi 함수는 Gemini API에 질문을 전달하고 응답을 받아 처리합니다.
    • 사용하려는 모델, max_tokens, temperature 등의 파라미터는 Gemini API 문서에 따라 적절히 설정해야 합니다.
  2. Slack 메시지 처리
    • Slack에서 받은 메시지를 doPost 함수가 처리하고, 그 메시지를 Gemini API로 전달하여 답변을 받습니다.
    • Slack 메시지 이벤트에서 받은 channeltimestamp를 사용하여 해당 메시지에 대한 스레드 댓글로 답변을 남깁니다.
  3. Slack에 답변 댓글 작성
    • chat.postMessage Slack API를 사용하여 Gemini API에서 받은 답변을 Slack 스레드에 댓글로 달아줍니다.

이 과정을 통해 GPT API 대신 Gemini API를 사용하여 Slack에서 질문을 받고, 그 답변을 Slack에 자동으로 댓글로 기록하는 Slack Bot을 만들 수 있습니다.

728x90