🤖

単語学習爆速化!ChatGPT x Google Apps Script で単語帳を自動生成してみた!

2023/02/12に公開

概要

こんなやつを作ります。

https://twitter.com/sasapanchama/status/1624433750326251531?s=20&t=fZfK6Zio-El1BdSa4QTGDA

課題

「ゲームもした〜い!英語勉強もした〜い!」という強欲の壺なので、
ゲームの設定言語を英語にして進めています。

知らない単語をその都度調べていると、
テンポが悪くゲームへの没入感が激減してしまいました。

そこで今話題のChatGPT先生にお願いして、
記入するだけで日本語・発音記号・分類・例文(英語)・例文(日本語)を
自動生成してもらえるようにしました。

解決方法

フロー

操作

  1. Google Spreadsheet: 単語を記入する
  2. Google Spreadsheet: ボタンをクリックする

処理

  1. Google Apps Script: 翻訳されていない単語を取得しChatGPTに送信する
  2. ChatGPT: 単語を元に情報を生成する
  3. Google Apps Script: 翻訳された情報を取得してGoogle Spreadsheetに記入する

コード

const CHATGPT_API_KEY = "{{ APIキー }}";
const CHATGPT_API_URL = "https://api.openai.com/v1/completions";

const sheet = SpreadsheetApp.getActiveSheet();

/**
 * 翻訳されていない単語をシートから取得する関数です
 * @return {string[]} 翻訳されていない単語の配列
 */
const getNotTranslatedWords = () => {
  /** 記入済みの範囲を取得しています */
  const range = sheet.getRange(`A2:F${sheet.getLastRow()}`);
  /** 記入済みの範囲の情報を取得しています */
  const values = range.getValues();
  /** 日本語が記入されていない行の単語を配列に格納しています */
  const words = [];
  values.map((value) => {
    if (value[1]) return;
    const word = value[0];
    words.push(word);
  });
  return words;
};

/**
 * 翻訳された情報をシートへ記入する関数です
 * @param {string[]} translatedWords 翻訳された情報の配列(テーブル形式)
 */
const setTranslatedWords = (translatedWords) => {
  const lastRow = sheet.getLastRow();
  translatedWords.map((translatedWord, index) => {
    /** 現在の行を指定しています */
    const row = lastRow - (translatedWords.length - (index + 1));
    /** テーブル形式の情報を配列に変換しています */
    const rowValues = translatedWord.split("|");
    /** 不要な情報を削除しています */
    rowValues.shift();
    /** 不要な情報を削除しています */
    rowValues.pop();
    /** 日本語の列から日本語例文の列までのシートの範囲を指定しています */
    const range = sheet.getRange(`B${row}:F${row}`);
    /** 情報をシートへ記入しています */
    range.setValues([rowValues]);
  });
};

/**
 * ChatGPTに翻訳された情報を生成してもらう関数です
 * @param {string[]} words 翻訳されていない単語の配列
 * @return {JSON} ChatGPTのレスポンス
 */
const fetchChatGPT = (words) => {
  /** model にて使用したいモデルを指定しています */
  /** prompt にて命令文を英語で指定しています */
  /** temperature にて回答の自由度を指定しています */
  /** max_tokens にて上限の認識単語数を指定しています */
  const modelPayload = {
    model: "text-davinci-003",
    prompt: `Please provide this word, the Japanese, American style English Pronunciation Symbols, classification, English example sentences, and Japanese example sentences of the following words in table format.
    ${words.join("\n")}
    `,
    temperature: 0,
    max_tokens: 200,
  };
  const modelOptions = {
    headers: {
      "Content-Type": "application/json",
      Authorization: "Bearer " + CHATGPT_API_KEY,
    },
    payload: JSON.stringify(modelPayload),
  };
  const modelResponse = UrlFetchApp.fetch(CHATGPT_API_URL, modelOptions);
  return JSON.parse(modelResponse.getContentText());
};

/**
 * ボタンをタップした時に開始する関数です
 */
const onClick = () => {
  const notTranslatedWords = getNotTranslatedWords();
  const result = fetchChatGPT(notTranslatedWords);
  const translatedWords = result.choices[0].text.split("\n|");
  /** 不要な情報を削除しています */
  translatedWords.splice(0, 3);
  setTranslatedWords(translatedWords);
};

注意

  • fetchChatGPTmax_tokens は無料使用枠を超過しないように設定しています。

参考

Discussion