Gemini API를 사용하여 Google Workspace 작업 자동화하기

1. 시작하기 전에

이 Codelab에서는 Gemini API의 함수 호출 및 멀티 모달리티 기능을 사용하여 Google Workspace 작업을 자동화하는 방법을 알아봅니다.

기본 요건

  • Apps Script, JavaScript 또는 이와 유사한 프로그래밍 언어에 대한 기본 지식

학습 내용

  • Gemini API의 함수 호출 및 멀티 모달리티 기능을 활용하는 방법
  • 여러 Gemini API 호출을 함께 연결하는 방법
  • Gemini API를 사용하여 Google Workspace 작업을 자동화하는 방법

필요한 항목

  • 웹브라우저
  • Gmail 계정 또는 Gemini API의 특정 설정이 구현된 Google Workspace 계정이 필요합니다.
  • Gemini API가 지원되는 리전의 연결입니다.
  • 선택사항: 직접 API 요청을 테스트하기 위한 curl 프로그램이 포함된 명령줄 인터페이스

이 Codelab의 전체 코드는 GitHub의 Gemini API 설명서에서 확인할 수 있습니다. 완성된 코드가 필요하다면 확인해 보세요.

2. Gemini API 설정

Gemini 정보

Gemini 모델은 Google에서 가장 크고 성능이 뛰어난 AI 모델 제품군입니다. 앱에서 이러한 모델을 활용하려면 Gemini API를 사용하면 됩니다. 또한 API용 웹 인터페이스인 Google AI Studio에서 Gemini API를 사용해 볼 수 있습니다. 코드를 작성하지 않고도 프롬프트를 사용해 보고, 모델 설정을 조정하고, 커스텀 모델을 조정할 수 있습니다.

키 가져오기

선택사항: 키 테스트

curl을 사용해 명령줄에 액세스할 수 있다면 다음 블록의 첫 번째 줄에 키를 추가한 다음 터미널에서 실행하여 API 키를 테스트합니다.

export GOOGLE_API_KEY=Paste_your_API_key_here

curl "https://generativelanguage.googleapis.com/v1beta/models?key=${GOOGLE_API_KEY}"

model/gemini-1.0-pro와 같은 JSON 형식의 모델 목록이 표시됩니다. 이것은 잘 작동했음을 의미합니다.

3. 선택사항: Gemini API에 요청하기

이 선택사항 단계에서는 콘텐츠 생성의 작동 방식을 더 잘 이해할 수 있도록 Gemini API에 요청한 후 Apps Script 앱에 추가합니다.

모델 정보

Gemini API는 다양한 기능과 제한이 있는 여러 모델을 제공합니다. 각 모델은 Gemini 모델 페이지에 기능과 함께 나열되어 있습니다.

첫 번째 요청 만들기

Gemini API가 텍스트 프롬프트를 완성하도록 하려면 JSON 요청을 빌드하고 REST API 엔드포인트로 전송합니다.

단계는 다음과 같습니다.

  1. 새 파일에서 다음 JSON 요청을 입력합니다.
{
  contents: [
   {
     parts: [
       { text: 'The most important aspects of a persuasive presentation are:' }
     ]
   }
 ]
}

JSON 요청에는 The most important aspects of a persuasive presentation are: 프롬프트가 포함됩니다. 모델이 이 명령을 완료하고 결과를 직접 제공합니다.

JSON 요청에는 채워지는 세 개의 최상위 필드(contents, generationConfig, safetySettings)가 있습니다. contents만 필요합니다. 나머지는 출력을 제어하는 메커니즘을 제공합니다.

  1. 이 JSON을 presentation.txt 파일에 저장한 후 다음과 같이 curl에 직접 전달합니다.
curl -H 'Content-Type: application/json' -X POST -d @presentation.txt \
  'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-latest:generateContent?key='${GOOGLE_API_KEY}

이 예에서는 URL에 다음 값을 설정합니다.

  • v1beta은 API 버전을 지정합니다.
  • gemini-1.0-pro-latest이 Gemini 1.0 Pro를 모델로 지정하고 최신 스냅샷을 사용합니다.
  • generateContent는 호출할 API 메서드를 지정합니다.

다음과 비슷한 결과가 표시됩니다.

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "* **Credibility:** The audience must trust that you are an expert on the subject matter and that you have their best interests at heart.\n* **Clearness:** Your message must be easy to understand and follow. Avoid using jargon or technical terms that your audience may not be familiar with.\n* **Concreteness:** Use specific examples and data to support your arguments. Avoid making vague or general claims.\n* **Emotional appeal:** In addition to appealing to the audience's logical side, you should also try to connect with them on an emotional level. Use storytelling, humor, and personal anecdotes to make your points more memorable and engaging.\n* **Strong closing:** End your presentation with a strong call to action. Tell the audience what you want them to do and why it is important for them to do it."
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [...]
    }
  ],
  "promptFeedback": {
    "safetyRatings": [...]
  }
}

가독성을 위해 다음은 정기적으로 형식이 지정된 터미널 출력입니다.

  • 신빙성: 시청자가 해당 주제의 전문가이며, 시청자의 최선의 관심을 염두에 두고 있다고 믿어야 합니다.
  • 명확성: 메시지는 쉽게 이해하고 따를 수 있어야 합니다. 시청자에게 익숙하지 않은 전문 용어나 기술 용어를 사용하지 마세요.
  • 구체성: 주장을 뒷받침하는 구체적인 예시와 데이터를 사용하세요. 모호하거나 일반적인 주장은 피하세요.
  • 정서적 호소: 시청자의 논리적인 측면에 호소하는 것 외에도 정서적인 면에서 시청자와도 공감대를 형성해야 합니다. 스토리텔링, 유머, 개인적인 일화를 사용하여 요점을 더 기억에 남고 흥미롭게 만듭니다.
  • 강력한 마무리: 강렬한 클릭 유도 문구로 프레젠테이션을 종료합니다. 시청자에게 원하는 바와 그 일을 하는 것이 중요한 이유를 설명하세요.

generationConfigsafetySettings를 비롯한 다른 설정에 대해 자세히 알아보려면 프롬프트안전 가이드를 참고하세요.

4. Apps Script에서 Gemini API 호출

  1. script.new를 방문하면 code.gs Apps Script 파일이 자동으로 생성됩니다.
  2. code.gs 파일 위에 커서를 올린 다음 8bfe57773be886ab.png 아이콘을 클릭합니다. 이름 바꾸기.
  3. 파일 이름을 utils.gs로 변경합니다.
  4. 파일에서 myFunction 함수를 삭제하여 파일이 비어 있도록 합니다.

프로젝트에 API 키 추가

  1. 탐색 메뉴에서 프로젝트 설정을 선택합니다.
  2. 스크립트 속성에서 스크립트 속성 추가를 클릭합니다.
  3. 속성GOOGLE_API_KEY를 입력합니다.
  4. 에 Google AI Studio의 API 키를 입력합니다.

fcfe205a93879c49.png

  1. 스크립트 속성 저장을 클릭합니다.
  2. 편집기로 다시 이동합니다.

Gemini API 코드 추가

utils.gs 파일에서 다음 단계를 따르세요.

API 키 및 엔드포인트를 설정합니다.

const properties = PropertiesService.getScriptProperties().getProperties();
const geminiApiKey = properties['GOOGLE_API_KEY'];
const geminiEndpoint = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-latest:generateContent?key=${geminiApiKey}`;
  1. 특정 프롬프트로 Gemini API를 호출하는 다음 함수를 추가합니다.
function callGemini(prompt, temperature=0) {
  const payload = {
    "contents": [
      {
        "parts": [
          {
            "text": prompt
          },
        ]
      }
    ], 
    "generationConfig":  {
      "temperature": temperature,
    },
  };

  const options = { 
    'method' : 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(geminiEndpoint, options);
  const data = JSON.parse(response);
  const content = data["candidates"][0]["content"]["parts"][0]["text"];
  return content;
}
  1. 프롬프트를 설정하는 다음 함수를 추가합니다.
function testGemini() {
  const prompt = "The best thing since sliced bread is";
  const output = callGemini(prompt);
  console.log(prompt, output);
}

테스트

  1. 76113423d1f91775.png 저장을 클릭합니다.
  2. 함수 드롭다운 목록에서 testGemini를 선택하고 5b9034ff679c8761.png를 클릭합니다.
  3. 필요한 권한을 수락합니다. 코드가 실행되고 실행 로그에 결과가 포함된 콘솔 출력이 표시됩니다.

실행 로그

잘 됐어!

5. 이미지로 Gemini API 호출하기

Gemini 모델 제품군의 가장 강력한 기능 중 하나는 멀티모달 입력 지원입니다. 즉, 텍스트 외에도 다양한 입력을 제공할 수 있습니다. 이 섹션에서는 이미지를 사용하여 Gemini API를 호출하는 함수를 추가합니다.

  • utils.gs 파일 상단에서 기존 const geminiEndpoint 선언 뒤에 다음 줄을 추가합니다.
const geminiProVisionEndpoint = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${geminiApiKey}`;

Gemini Vision 코드 추가

  1. 새로 추가된 이 엔드포인트를 호출하는 함수를 utils.gs 파일에 추가합니다.
function callGeminiProVision(prompt, image, temperature=0) {
  const imageData = Utilities.base64Encode(image.getAs('image/png').getBytes());

  const payload = {
    "contents": [
      {
        "parts": [
          {
            "text": prompt
          },
          {
            "inlineData": {
              "mimeType": "image/png",
              "data": imageData
            }
          }          
        ]
      }
    ], 
    "generationConfig":  {
      "temperature": temperature,
    },
  };

  const options = { 
    'method' : 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(geminiProVisionEndpoint, options);
  const data = JSON.parse(response);
  const content = data["candidates"][0]["content"]["parts"][0]["text"];
  return content;
}
  1. 다음 테스트 함수를 추가합니다.
function testGeminiVision() {
  const prompt = "Provide a fun fact about this object.";
  const image = UrlFetchApp.fetch('https://storage.googleapis.com/generativeai-downloads/images/instrument.jpg').getBlob();
  const output = callGeminiProVision(prompt, image);
  console.log(prompt, output);
}

이 함수는 인터넷에서 테스트 이미지를 로드하여 정의된 함수에 전달합니다. 나중에 스프레드시트의 차트를 사용하기 위해 이를 연결하므로 이는 테스트일 뿐입니다.

테스트

  • testGeminiVision 함수를 저장하고 실행한 다음 출력을 검사합니다.

849c6728bfb5ec52.png

6. 도구로 Gemini API 호출

프롬프트에서 텍스트와 이미지 외에도 도구에 대한 액세스 권한을 제공할 수 있습니다.

도구 처리 코드 추가

  • 도구 사양을 허용하는 함수를 utils.gs 파일에 추가합니다.
function callGeminiWithTools(prompt, tools, temperature=0) {
  const payload = {
    "contents": [
      {
        "parts": [
          {
            "text": prompt
          },
        ]
      }
    ], 
    "tools" : tools,
    "generationConfig":  {
      "temperature": temperature,
    },    
  };

  const options = { 
    'method' : 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };

  const response = UrlFetchApp.fetch(geminiEndpoint, options);
  const data = JSON.parse(response);
  const content = data["candidates"][0]["content"]["parts"][0]["functionCall"];
  return content;
}

이 스키마 및 사용 가능한 필드에 대한 자세한 내용은 FunctionDeclaration API 참조를 확인하세요.

테스트

  1. 모델이 현재 날짜와 시간을 찾는 데 사용할 수 있는 도구를 정의합니다.
function testGeminiTools() {
  const prompt = "Tell me how many days there are left in this month.";
  const tools = {
    "function_declarations": [
      {
        "name": "datetime",
        "description": "Returns the current date and time as a formatted string.",
        "parameters": {
          "type": "string"
        }
      }
    ]
  };
  const output = callGeminiWithTools(prompt, tools);
  console.log(prompt, output);
}

여기서 사용된 형식은 FunctionDeclaration 스키마입니다. 실제로 날짜-시간 함수를 호출하지 않습니다. 모델이 함수 호출을 요청했다는 표시만 받습니다. 함수 호출은 이후 단계에서 처리합니다.

  1. 저장하고 testGeminiTools 함수를 실행하여 출력을 확인합니다.

실행 로그

7. Google Workspace와의 데모 통합 개요

함수 호출의 작동 방식을 이해했으니 이제 Gemini 모델의 기능을 다른 서비스로 쉽게 확장할 수 있습니다. 다음 섹션에서는 Google Drive, Google Slides, Google Sheets와 같은 Google Workspace 제품과의 통합을 빌드합니다. 다음은 간단한 다이어그램입니다.

도구 3개

대략적으로 사용자 쿼리가 수신되면 Gemini API의 함수 호출을 사용하여 사용할 도구를 결정합니다. 다음 작업을 할 수 있는 세 가지 도구를 빌드합니다.

  • 회의를 예약합니다. 다이어그램의 setupMeeting() 함수는 Gemini 1.0 Pro API를 호출하여 Google Drive의 블로그를 요약하고 Google Calendar에서 새로 생성된 회의에 요약을 추가합니다.
  • 차트의 통계를 기반으로 이메일 초안을 작성합니다. 다이어그램의 draftEmail() 함수는 Gemini 1.0 Pro Vision을 호출하여 Google Sheets의 차트를 분석하고 분석을 기반으로 Gmail에서 이메일을 작성합니다.
  • 스켈레톤 자료를 만듭니다. 다이어그램의 createDeck() 함수는 Gemini 1.0 Pro를 호출하여 Google Slides 자료의 글머리 기호를 브레인스토밍합니다.

각 도구에 대해 다음 세 가지 작업을 실행해야 합니다.

  1. Gemini API의 함수 호출 응답이 if...else 블록에서 특정 도구를 호출하도록 요청하는지 확인합니다.
  2. 실제 함수를 추가하여 도구 기능을 구현합니다.
  3. Gemini 모델이 도구의 존재를 인식하고 올바른 함수 호출 응답을 반환할 수 있도록 Gemini API로 도구를 선언합니다.

8. Apps Script로 회의 설정하기

먼저 Google Calendar에서 회의 설정을 자동화하지만 Google Drive의 파일 요약인 설명도 추가합니다.

단계는 다음과 같습니다.

  1. 텍스트 파일을 다운로드하세요. 이 파일은 Gemini 1.5 Pro 출시 블로그의 텍스트 사본입니다.
  2. Google Drive의 루트 폴더에 파일을 업로드합니다.
  3. 편집기에서 main.gs 파일을 만든 후 다음 코드를 추가합니다.
function main() {
  const userQuery = "Set up a meeting at 10AM tomorrow with Helen to discuss the news in the Gemini-blog.txt file.";

  var tool_use = callGeminiWithTools(userQuery, WORKSPACE_TOOLS);
  Logger.log(tool_use);
  
  if(tool_use['name'] == "setupMeeting") {
    setupMeeting(tool_use['args']['time'], tool_use['args']['recipient'], tool_use['args']['filename']);
    Logger.log("Your meeting has been set up.");
 }
  else
    Logger.log("no proper tool found");
}

여기서는 Gemini API의 함수 호출 기능을 호출합니다. 다음으로 도구 함수를 정의해야 합니다.

  1. 편집기 왼쪽에서 서비스 옆에 있는 + 서비스 추가 >를 클릭합니다. Google 캘린더 API 추가를 클릭합니다. 이렇게 하면 나중에 일부 고급 API에 사용해야 하는 고급 Google 캘린더 서비스가 사용 설정됩니다.

서비스 추가

  1. utils.gs 파일에서 다음 코드를 추가합니다.
function attachFileToMeeting(event, file, fileName) {
  // Get the iCal ID for the event.
  const iCalEventId = event.getId();

  // Log the ID and title for debugging.
  console.log(`iCal event ID: ${iCalEventId}`);
  console.log(`event Title: ${event.getTitle()}`);

  // Set up the options for listing the event with the advanced Google Calendar service.
  const options = {
      iCalUID: iCalEventId,
    };

  // Use the primary calendar as the calendar ID to list events.
  const calendarId = 'primary';

  // Use the advanced Google Calendar service to list the event.
  const calEvents = Calendar.Events.list(calendarId, options);

  // Get the Calendar ID used by the advanced Google Calendar service.
  const eventId = calEvents.items[0].id;

  // Get the file URL for the attachment.
  const fileUrl = file.getUrl();

    // Set up the patch options to add the file.
    var patch = {
      attachments: [{
        'fileUrl': fileUrl,
        'title': fileName
      }]
    };

    // Patch the event to add the file as an attachment.
    Calendar.Events.patch(patch, 'primary', eventId, {"supportsAttachments": true});  
}

function setupMeeting(time, recipient, filename) {
  const files = DriveApp.getFilesByName(filename);
  const file = files.next();
  const blogContent = file.getAs("text/*").getDataAsString();
  
  var geminiOutput = callGemini("Give me a really short title of this blog and a summary with less than three sentences. Please return the result as a JSON with two fields: title and summary. \n" +  blogContent);
  // The Gemini model likes to enclose the JSON with ```json and ```
  geminiOutput = JSON.parse(geminiOutput.replace(/```(?:json|)/g, ""));  
  const title = geminiOutput['title'];
  const fileSummary = geminiOutput['summary'];

  const event = CalendarApp.getDefaultCalendar().createEventFromDescription(`meet ${recipient} at ${time} to discuss "${title}"`); 
  event.setDescription(fileSummary);
  attachFileToMeeting(event, file, filename);
}

이 코드는 다음 작업을 실행합니다.

  • setupMeeting() 함수는 Google Drive를 탐색하여 Gemini-blog.txt 파일을 찾습니다. 이 파일 이름은 3단계에서 Gemini API의 함수 호출에 의해 자동으로 반환됩니다.
  • setupMeeting() 함수는 Gemini API를 호출하여 파일의 콘텐츠를 요약하고, 자유 형식 설명을 사용하여 CalendarApp으로 회의를 설정하고, 회의에 요약을 추가합니다.
  • setupMeeting() 함수는 attachFileToMeeting() 함수를 호출하여 고급 Google Calendar 서비스를 사용하여 회의에 블로그 파일을 첨부합니다.
  1. utils.gs 파일 상단에 다음 코드를 추가합니다.
const WORKSPACE_TOOLS = {
 "function_declarations": [
   {
     "name": "setupMeeting",
     "description": "Sets up a meeting in Google Calendar.",
     "parameters": {
       "type": "object",
       "properties": {
         "time": {
           "type": "string",
           "description": "The time of the meeting."
         },
         "recipient": {
           "type": "string",
           "description": "The name of the recipient."
         },   
         "filename": {
           "type": "string",
           "description": "The name of the file."
         },                     
       },
       "required": [
         "time",
         "recipient",
         "filename"
       ]
     }
   },
   // You add tools here.        
 ]
};
  1. 편집기에서 main.gs 파일로 돌아가서 5b9034ff679c8761.png를 클릭합니다.
  2. Google Workspace에 스크립트 실행 권한을 요청하는 메시지가 표시되면 확인을 클릭합니다.

몇 초 후 실행 로그에 회의가 설정되었음을 알리는 메시지가 표시됩니다.

  1. Google Calendar에서 요약 및 첨부파일이 있는 회의를 찾습니다.

회의 초대

9. Apps Script로 이메일 초안 작성하기

그런 다음 Gmail에서 이메일 초안을 자동화합니다. 시나리오: Google Sheets에서 데이터 분석을 수행한다고 가정해 보겠습니다. 모든 숫자를 제자리에 대고 차트를 만듭니다. Gemini Pro Vision API를 사용하여 차트를 기반으로 이메일 초안을 작성하려고 합니다.

단계는 다음과 같습니다.

  1. 시트를 열고 파일 -> 사본 만들기.
  2. 문서 복사 대화상자의 이름 텍스트 상자에서 기본 이름 Copy of CollegeExpensesCollegeExpenses로 바꿉니다.
  3. main.gs 파일에서 이전 사용자 쿼리를 새 쿼리로 바꾸고 다음 코드를 if...else 문에 추가합니다.
function main() {
  // const userQuery = "Set up a meeting at 5PM with Helen to discuss the news in the Gemini-1.5-blog.txt file.";  
  const userQuery = "Draft an email for Mary with insights from the chart in the CollegeExpenses sheet.";

  if(...) {...}
  // Add this code
  else if(tool_use['name'] == "draftEmail") {
    draftEmail(tool_use['args']['sheet_name'], tool_use['args']['recipient']);
    Logger.log("Check your Gmail to review the draft");
  }
  else {...}

}
  1. utils.gs 파일에서 다음 코드를 추가합니다.
function draftEmail(sheet_name, recipient) {
  
  const prompt = `Compose the email body for ${recipient} with your insights for this chart. Use information in this chart only and do not do historical comparisons. Be concise.`;

  var files = DriveApp.getFilesByName(sheet_name);
  var sheet = SpreadsheetApp.openById(files.next().getId()).getSheetByName("Sheet1");
  var expenseChart = sheet.getCharts()[0];

  var chartFile = DriveApp.createFile(expenseChart.getBlob().setName("ExpenseChart.png"));
  var emailBody = callGeminiProVision(prompt, expenseChart);
  GmailApp.createDraft(recipient+"@demo-email-provider.com", "College expenses", emailBody, {
      attachments: [chartFile.getAs(MimeType.PNG)],
      name: 'myname'
  });
}

이 함수는 시트에서 대학 지출 차트를 가져와 Gemini Pro Vision으로 전송하여 이메일 초안을 작성합니다. Gemini Pro Vision은 차트에서 정보를 추출하고 사용자를 대신하여 이메일 본문의 초안을 작성합니다.

  1. utils.gs 파일에서 You add tools here 주석 뒤의 WORKSPACE_TOOLS 객체에 다음 코드를 추가합니다.
  WORKSPACE_TOOLS = {
    "function_declarations": [
      // You add tools here.

      {
        "name": "draftEmail",
        "description": "Write an email by analyzing data or charts in a Google Sheets file.",
        "parameters": {
          "type": "object",
          "properties": {
            "sheet_name": {
              "type": "string",
              "description": "The name of the sheet to analyze."
            },
            "recipient": {
              "type": "string",
              "description": "The name of the recipient."
            },            
          },
          "required": [
            "sheet_name",
            "recipient"
          ]
        }
      },   


    ]
  };
  1. 편집기에서 main.gs 파일로 다시 이동한 후 5b9034ff679c8761.png를 클릭합니다.
  2. 10~20초 후에 Gmail을 엽니다. 이메일 초안이 다음과 같이 표시됩니다.

이메일 초안을 보내기 전에 수정할 수 있습니다. 짧은 프롬프트와 차트를 입력하면 이 이메일은 전적으로 Gemini Pro Vision에서 작성됩니다.

10. Apps Script로 스켈레톤 자료 만들기

다음으로 Apps Script를 사용하여 Google Slides에서 스켈레톤 자료 생성을 자동화합니다.

단계는 다음과 같습니다.

  1. main.gs 파일에서 이전 사용자 쿼리를 새 쿼리로 바꾸고 if...else 문에 다음 코드를 추가합니다.
function main() {
  // const userQuery = "Draft an email for Mary with insights from the chart in the CollegeExpenses sheet.";
  const userQuery = "Help me put together a deck about water conservation.";

  if(...) {...}
  // Add this code
  else if(tool_use['name'] == 'createDeck') {
    deckURL = createDeck(tool_use['args']['topic']);
    Logger.log("Deck URL: " + deckURL);
  }
  else {...}

}
  1. utils.gs 파일에서 다음 코드를 추가합니다.
function createDeck(topic) {
  const prompt = `I'm preparing a ${NUM_SLIDES}-slide deck to discuss ${topic}. Please help me brainstorm and generate main bullet points for each slide. Keep the title of each slide short. Please produce the result as a valid JSON so that I can pass it to other APIs.`;
  
  var geminiOutput = callGemini(prompt, 0.4);
  // The Gemini model likes to enclose the JSON with ```json and ```
  geminiOutput = geminiOutput.replace(/```(?:json|)/g, "");
  const bulletPoints = JSON.parse(geminiOutput);
    
  // Create a Google Slides presentation.
  const presentation = SlidesApp.create("My New Presentation");

  // Set up the opening slide.
  var slide = presentation.getSlides()[0]; 
  var shapes = slide.getShapes();
  shapes[0].getText().setText(topic);

  var body;
  for (var i = 0; i < NUM_SLIDES; i++) {
      slide = presentation.appendSlide(SlidesApp.PredefinedLayout.TITLE_AND_BODY);
      shapes = slide.getShapes();
      // Set title.
      shapes[0].getText().setText(bulletPoints['slides'][i]['title']);
  
      // Set body.
      body = "";
      for (var j = 0; j < bulletPoints['slides'][i]['bullets'].length; j++) {
        body += '* ' + bulletPoints['slides'][i]['bullets'][j] + '\n';
      }
      shapes[1].getText().setText(body);
  } 

  return presentation.getUrl();
}

이 함수는 Gemini API를 호출하여 특정 주제를 브레인스토밍하고

Apps Script를 사용하여 스켈레톤 자료를 채웁니다.

  1. utils.gs 파일에서 You add tools here 주석 뒤의 WORKSPACE_TOOLS 객체에 다음 코드를 추가합니다.
  WORKSPACE_TOOLS = {
    "function_declarations": [
      // You add tools here.

      {
        "name": "createDeck",
        "description": "Build a simple presentation deck with Google Slides and return the URL.",
        "parameters": {
          "type": "object",
          "properties": {
            "topic": {
              "type": "string",
              "description": "The topic that the presentation is about."
            },
          },
          "required": [
            "topic"
          ]
        }
      },


    ]
  };
  1. utils.gs 파일 상단에서 다음 상수를 정의합니다.
const NUM_SLIDES = 3;

이는 시작 슬라이드 외에 Gemini 모델이 생성하는 슬라이드의 수입니다.

  1. 편집기에서 main.gs 파일로 다시 이동한 후 5b9034ff679c8761.png를 클릭합니다. 몇 초 후 실행 로그에 프레젠테이션 URL이 표시됩니다.
  2. 브라우저를 사용하여 URL을 엽니다. 글머리 기호로 채워진 스켈레톤 자료가 표시됩니다.

초안 자료

11. 탐구 아이디어

이 세 가지 통합 외에도 다음과 같은 아이디어를 살펴볼 수 있습니다.

  • Google Chat에서 챗봇 빌드 대규모 언어 모델 (LLM)의 가장 일반적인 사용 사례 중 하나는 챗봇 빌드입니다. Gemini API를 사용하면 Google Chat용 챗봇을 쉽게 빌드할 수 있습니다. 자세한 내용은 Google Chat API 및 Codelab Gemini를 사용하여 Google Chat 앱 빌드하기를 참고하세요.
  • Google Drive 또는 Keep의 자체 데이터로 검색 증강 생성 (RAG). 이 Codelab에서는 요약에 단일 텍스트 파일만 사용합니다. 그러나 개인 Google Drive 및 Keep의 콘텐츠(예: 메모, PDF, 이미지)를 Gemini API, 벡터 데이터베이스, 그리고 선택적으로 LangChain과 같은 조정 도구와 함께 사용하여 RAG를 수행하고 데이터를 기반으로 모델의 응답을 맞춤설정할 수 있습니다.
  • Gemini API의 멀티턴 함수 호출 기능을 사용합니다. Gemini API의 함수 호출은 한 턴으로 제한되지 않으며 더 복잡한 작업의 경우 멀티턴 함수 호출도 가능합니다.
  • Google Workspace 그 이상 이제 Gemini API를 Google Workspace와 통합하는 방법을 이해했으므로 Google Workspace를 넘어 전 세계의 다른 API를 활용할 수 있습니다.

12. 축하합니다

Gemini API의 멀티모달 기능과 함수 호출에 대해 알아봤습니다. 이를 사용하여 Apps Script로 일부 Google Workspace 작업을 자동화했습니다.

자세히 알아보기