Gmail 경험을 강화하는 6가지 Google Apps Script 프로젝트

Gmail의 생산성과 자동화 기능을 다시 한번 강조하고 싶습니다. 이번에는 좀 더 기술적인 접근 방식을 취하여 Google Apps Script를 활용해 Gmail 환경을 개선해 보겠습니다.

Gmail은 업무 자동화 및 생산성 향상을 위해 여러 설정을 제공합니다. 하지만 이러한 설정에는 제약이 따르며, 많은 기능이 사용자의 요구 사항을 충족할 만큼 충분한 사용자 정의 옵션을 제공하지 않습니다. 바로 이러한 부분에서 Google Apps Script를 사용해 문제를 해결할 수 있습니다.

Google Apps Script를 사용하면 Gmail의 기본 기능으로는 불가능했던 작업을 수행하는 맞춤 스크립트를 만들 수 있습니다. 게다가, 이러한 스크립트를 자동화하도록 시간 기반 트리거를 설정하는 것도 가능합니다.

시작을 돕기 위해 Gmail 사용 경험을 확실히 향상시킬 수 있는 몇 가지 유용한 스크립트를 소개하겠습니다. 각 스크립트는 중복 제거 또는 새 폴더 자동 생성과 같은 일반적인 문제를 자동으로 해결하도록 설계되었습니다. 따라서 일부 스크립트는 의도한 목적보다 약간 길어 보일 수 있습니다.

Google Apps Script에서 스크립트 생성하기

이러한 스크립트를 적용하고 사용자 정의하기 전에 Google Apps Script에서 스크립트를 만들고 실행하는 방법을 먼저 알아야 합니다. 다음은 그 방법입니다.

Google Apps Script를 열고 왼쪽 패널에서 ‘새 프로젝트’ 버튼을 클릭합니다.

이제 기존 코드를 모두 삭제하고 제공된 스크립트를 복사하여 붙여넣어야 합니다. 그런 다음 ‘저장’ 버튼을 클릭하여 스크립트를 저장합니다.

스크립트를 실행하려면 저장 버튼 바로 옆에 있는 ‘실행’ 버튼을 클릭합니다. 권한을 부여하라는 메시지와 스크립트가 확인되지 않았다는 경고가 표시됩니다. 이 스크립트는 개인적인 용도로 사용되며 Google에서 검토하지 않았으므로 경고를 무시하고 권한을 부여해도 안전합니다.

스크립트가 실행되면 실행 로그에 성공적으로 실행되었는지 여부가 표시됩니다.

트리거 설정하기

이러한 스크립트 대부분은 자동으로 트리거될 때 가장 효과적입니다. 다행히 Google Apps Script에는 각 스크립트에 대해 시간 기반 트리거를 생성하여 자동으로 실행할 수 있는 기능이 있습니다.

하지만 트리거 생성에 대해 설명하기 전에 다음 사항을 알아야 합니다. Google Apps Script에는 할당량이 제한되어 있습니다. Google Workspace 요금제 가입 여부에 따라 할당량이 달라질 수 있습니다. 한 번에 너무 많은 스크립트를 너무 자주 실행하면 일일 할당량에 도달하여 해당 시간 동안 서비스가 중지될 수 있습니다.

매분마다 스크립트를 실행할 수 있는 옵션이 있지만, 그렇게 하면 일일 할당량이 빠르게 소진될 것입니다. 작업이 안정적으로 완료될 수 있는 적절한 간격으로 타이머를 설정하십시오.

트리거를 생성하려면 스크립트가 열린 상태에서 왼쪽 패널에서 ‘트리거’를 클릭한 다음 ‘트리거 추가’ 버튼을 클릭합니다.

여기에서 타이머를 분에서 월까지 선택할 수 있으며, 간격도 설정할 수 있습니다. 특정 날짜와 시간을 선택하여 해당 시간에만 스크립트를 한 번 실행할 수도 있습니다. 모든 선택을 완료했으면 ‘저장’을 클릭하여 트리거를 생성합니다.

이전에 언급했듯이 스크립트 실행 권한을 아직 부여하지 않았다면 트리거를 생성하기 전에 권한을 부여하라는 메시지가 표시됩니다.

트리거는 설정한 옵션에 따라 계속 실행됩니다. 문제가 발생하면 발생한 오류와 함께 알림을 받게 됩니다.

이제 Google Apps Script를 사용하여 Gmail 작업을 자동화하는 방법에 대한 몇 가지 실제 사례를 살펴보겠습니다.

반복 이메일 보내기

function sendRecurringEmail() {
  var recipient = "[email protected]";
  var subject = "여기에 제목을 입력하세요";
  var message = "여기에 사용자 정의 메시지를 입력하세요";

  GmailApp.sendEmail(recipient, subject, message);
}

Gmail에서는 이메일을 예약할 수 있지만 반복 이메일은 예약할 수 없습니다. 누군가에게 무언가를 상기시키거나 이메일이 누락되지 않도록 하려면 이 간단한 스크립트가 유용할 수 있습니다. 이 스크립트는 사용자가 제공한 제목과 메시지가 포함된 이메일을 지정된 주소로 보냅니다. 그런 다음 트리거 옵션에서 반복 트리거를 설정할 수 있습니다.

스크립트에서 수신자, 제목, 메시지 섹션을 실제 정보로 편집하십시오. 예시 텍스트 주변의 따옴표가 그대로 유지되는지 확인해야 합니다. 예를 들어, 제목은 다음과 같이 입력해야 합니다.

var subject = "중요 알림";

트리거의 최대 간격은 최대 한 달이므로 반복 메시지는 한 달에 한 번만 보낼 수 있습니다. 안타깝게도 이는 매년 발생하는 행사에 대한 메시지를 보내는 데는 사용할 수 없다는 의미입니다.

라벨을 사용하여 링크가 있는 이메일 필터링

function processUnreadEmailsWithLinks() {
  var labelName="링크가 있는 이메일";
  var label = GmailApp.getUserLabelByName(labelName);
  if (!label) {
    label = GmailApp.createLabel(labelName);
  }
  var threads = GmailApp.search('is:unread');
  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 body = message.getBody();
      if (bodyContainsLinks(body)) {
        label.addToThread(threads[i]);
      }
    }
  }
}

function bodyContainsLinks(body) {
  var regex = /https?:\/\/[^\s<>"']+/g;
  return regex.test(body);
}

일반적으로 본문에 링크가 있는 이메일은 더 중요한 경우가 많습니다. 동료로부터 보고서를 받든, 특정 리소스를 제공하는 뉴스레터를 구독하든, 링크가 있는 이메일을 분류하는 것은 매우 유용할 수 있습니다.

이 스크립트는 Gmail 계정에서 읽지 않은 모든 이메일을 검토하고 이메일 본문에 링크가 있는 이메일을 ‘링크가 있는 이메일’이라는 새 라벨로 분리합니다. 기본적으로 Gmail 전체에서 이메일을 검색하지만, `var threads = GmailApp.search(‘is:unread’);` 부분을 수정하여 검색 범위를 좁힐 수 있습니다. 다음은 수정할 수 있는 몇 가지 예시입니다.

받은 편지함에서만 검색: `var threads = GmailApp.search(‘in:inbox is:unread’);`

다른 라벨에서 검색: `var threads = GmailApp.search(‘in:inbox is:unread OR in:promotions is:unread OR in:important is:unread’);`

받은 편지함에서 읽거나 읽지 않은 모든 이메일 검색: `var threads = GmailApp.search(‘in:inbox’);`

특정 발신자의 이메일 검색: `var threads = GmailApp.search(‘from:[email protected]‘);`

이 예시는 스크립트를 편집하여 링크가 있는 이메일의 검색 범위를 좁히는 방법에 대한 아이디어를 제공합니다. 또한, 이러한 유형의 이메일에는 일일 트리거를 설정하는 것만으로 충분하다고 생각합니다.

오래된 이메일 자동 삭제

function deleteOldEmails() {
  var threads = GmailApp.search('older_than:30d');
  for (var i = 0; i < threads.length; i++) {
    threads[i].moveToTrash();
  }
}

오래된 이메일을 보관하고 싶지 않다면 이 스크립트를 사용하여 특정 기간보다 오래된 이메일을 삭제할 수 있습니다. 이 스크립트는 Gmail에서 30일이 지난 모든 이메일을 찾아 휴지통으로 보냅니다. `older_than:30d` 부분을 편집하여 삭제할 이메일의 기간을 ‘older_than:180d’와 같이 변경할 수 있습니다.

대신 특정 라벨에서 이메일을 삭제하려면 `Gmail.App.search` 부분을 편집하여 라벨을 포함하면 됩니다. 예를 들면 다음과 같습니다.

`var threads = GmailApp.search(‘in:inbox old_than:30d’);`

프로세스를 자동화하려면 며칠마다 자동으로 스크립트를 실행하는 트리거를 만듭니다. 삭제하려는 이메일의 오래된 정도에 따라 주간 또는 월간 트리거도 괜찮을 것입니다.

모든 이메일 주소를 Google 스프레드시트에 저장

function getEmailAddresses() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetName = "이메일 주소";
  var sheet = ss.getSheetByName(sheetName);
  
  if (!sheet) {
    sheet = ss.insertSheet(sheetName);
    sheet.appendRow(["이메일 주소"]);
  }
  
  var threads = GmailApp.getInboxThreads();
  var emailAddresses = [];
  
  var existingData = sheet.getDataRange().getValues();
  if (existingData.length > 1) {
    var existingEmailAddresses = existingData.slice(1).flat();
  } else {
    var existingEmailAddresses = [];
  }
  
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var emailAddress = messages[j].getFrom();
      if (emailAddresses.indexOf(emailAddress) === -1 && existingEmailAddresses.indexOf(emailAddress) === -1) {
        emailAddresses.push(emailAddress);
      }
    }
  }
  
  for (var k = 0; k < emailAddresses.length; k++) {
    sheet.appendRow([emailAddresses[k]]);
  }
}

이 스크립트는 Gmail에서 모든 이메일을 검색하고 발신자/수신자의 이름과 이메일 주소를 복사하여 Google 스프레드시트에 저장합니다. 이메일 마케팅을 위한 메일링 리스트를 만들거나, 연락하는 모든 사람의 기록을 생성하는 등 다양한 용도로 사용할 수 있습니다.

하지만 이 스크립트를 만드는 것은 시트를 식별할 수 있도록 Google 스프레드시트 내에서 Google Apps Script를 열어야 하기 때문에 다른 스크립트와 약간 다릅니다. 하지만 이 과정은 처음 한 번만 수행하면 됩니다. 방법은 다음과 같습니다.

새 시트를 열고 Google 스프레드시트로 이동합니다. 위 메뉴에서 ‘확장 프로그램’을 클릭한 다음 ‘Apps Script’를 선택합니다. 그러면 Google Apps Script가 열리고 이전에 설명한 대로 스크립트를 추가하고 실행할 수 있습니다.

스크립트는 동일한 셀에 이름과 이메일 주소가 기록된 ‘이메일 주소’라는 이름의 새 시트를 만듭니다. 나중에 각 트리거에 대해 시트를 다시 열 필요가 없습니다. 새 이메일 주소는 중복 없이 시트의 마지막 부분에 업데이트됩니다.

새로운 보낸 사람으로부터 이메일을 받는 빈도에 따라 매일 또는 매주 트리거하는 것이 좋습니다.

이메일 첨부 파일을 Google 드라이브에 자동으로 저장

function onNewEmail(e) {
  var threads = GmailApp.getInboxThreads(0, 1);
  var messages = threads[0].getMessages();
  
  var folderName = "이메일 첨부 파일";
  var folderIterator = DriveApp.getFoldersByName(folderName);
  var folder;

  if (folderIterator.hasNext()) {
    folder = folderIterator.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }
  
  for (var i = 0; i < messages.length; i++) {
    var message = messages[i];
    
    if (message.getAttachments().length > 0) {
      var attachments = message.getAttachments();
      
      for (var j = 0; j < attachments.length; j++) {
        var attachment = attachments[j];
        var attachmentHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, attachment.getBytes()));
        var existingFiles = folder.getFiles();

        var isDuplicate = false;

        while (existingFiles.hasNext()) {
          var existingFile = existingFiles.next();
          var existingFileHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, existingFile.getBlob().getBytes()));

          if (attachmentHash === existingFileHash) {
            isDuplicate = true;
            break;
          }
        }

        if (!isDuplicate) {
          folder.createFile(attachment);
        }
      }
    }
  }
}

이메일을 통해 중요한 첨부 파일을 자주 받는 경우, 이 스크립트는 매우 유용합니다. 이 스크립트는 첨부 파일을 안전하게 보관할 수 있을 뿐만 아니라 첨부 파일을 관리하기 위한 더 나은 인터페이스를 제공합니다.

이 스크립트는 처음 실행된 후 수신되는 새 이메일에서만 작동하도록 코딩되어 있습니다. 사용할 수 없는 경우 Google 드라이브에 ‘이메일 첨부 파일’이라는 새 폴더가 자동으로 생성됩니다. 또한, 중복된 파일 확인 시 파일 이름 대신 파일 콘텐츠의 MD5 해시 값을 사용합니다. 왜냐하면 파일 이름은 다른 파일에서 동일할 수 있기 때문입니다.

모든 사람이 새 첨부 파일만 저장하려는 것은 아니며, 이미 받은 이메일의 첨부 파일도 저장하고 싶을 수 있다는 것을 알고 있습니다. 이를 위해 아래에 제공되는 스크립트는 동일한 규칙을 따르지만 현재 존재하는 이메일의 첨부 파일을 저장하는 수정된 스크립트입니다. 단, 첨부 파일 수에 따라 모두 저장하는 데 시간이 다소 걸릴 수 있습니다.

function saveAllAttachmentsToDrive() {
  var folderName = "이메일 첨부 파일";
  var folderIterator = DriveApp.getFoldersByName(folderName);
  var folder;
  
  if (folderIterator.hasNext()) {
    folder = folderIterator.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }

  var threads = GmailApp.getInboxThreads();

  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();
      
      for (var k = 0; k < attachments.length; k++) {
        var attachment = attachments[k];
        var attachmentHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, attachment.getBytes()));
        var existingFiles = folder.getFiles();
        var isDuplicate = false;

        while (existingFiles.hasNext()) {
          var existingFile = existingFiles.next();
          var existingFileHash = Utilities.base64Encode(Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, existingFile.getBlob().getBytes()));

          if (attachmentHash === existingFileHash) {
            isDuplicate = true;
            break;
          }
        }

        if (!isDuplicate) {
          folder.createFile(attachment);
        }
      }
    }
  }
}

매일 영감을 주는 명언 받기

function sendDailyQuoteEmail() {
  var apiKey = 'YOUR_API_KEY';
  var endpoint="https://quotes.rest/qod";

  var response = UrlFetchApp.fetch(endpoint, {
    headers: {
      'X-TheySaidSo-Api-Secret': apiKey
    }
  });

  var data = JSON.parse(response.getContentText());
  var quoteContents = data.contents.quotes[0];
  var quote = quoteContents.quote;
  var author = quoteContents.author;

  var recipient="[email protected]";
  var subject="오늘의 명언";
  var message = `오늘의 명언:\n\n"${quote}"\n\n- ${author}`;

  GmailApp.sendEmail(recipient, subject, message);
}

업무 또는 이메일 관리에 직접적으로 활용되지 않을 수도 있지만, 받은 편지함에서 바로 매일 활력을 얻는 데 도움이 될 수 있습니다. 제대로 설정하면 이 스크립트는 They Said So API를 사용하여 매일 영감을 주는 명언을 이메일로 보냅니다. 설정 방법은 다음과 같습니다.

먼저 They Said So의 개인 API 키가 필요합니다. API 페이지에서 무료 계정을 등록하여 키를 얻을 수 있습니다. 이 키는 매일 명언을 받는 데 필요한 5회의 무료 호출을 제공합니다.

키를 얻었으면 `YOUR_API_KEY` 부분을 They Said So에서 받은 실제 키로 바꿔야 합니다. 또한 `[email protected]` 부분도 실제 이메일 주소로 바꿔야 합니다. 다른 사람을 위해 설정하려면 다른 사람의 이메일 주소를 사용하십시오.

이제 매일 실행되는 트리거를 설정하기만 하면 됩니다. 그보다 일찍 실행하면 당일 명언을 다시 보내게 됩니다.

마지막으로

개인적으로 이러한 모든 스크립트를 동시에 실행하는 데 아무런 문제가 없었으며 일일 할당량에도 도달하지 못했습니다. 과도하게 트리거를 설정하지 않는다면 괜찮을 것입니다. 또한, 스크립트에 오류가 발생하지 않도록 주기적으로 확인해야 합니다.