google sheet と openAI で英作文

(2025-05-03)

性懲りもなく英語です。

英語はボキャブラリーが大切と思ってはいたものの、結局あまり憶えられず今日に至っています。

では本当に勉強したのかというと、よく考えると夜は大抵酒を飲んで酔っ払っていたので、そんな状態で勉強しても記憶としては残らなかったのだと思います。

それと方法論が間違っていたのではないかとも思っています。

今ではいろいろなコンピュータ言語があって、それを利用すれば比較的簡単にアプリを作ることができます。

効率のよいアプリを作成しようと思いました。

例文の作成

まずは、openAI による英語の例文を作成する必要があります。
google スプレッドシートと openAI のコラボで英作文、その日本語訳などが簡単にできます。

openAI に課金

以前はお試しでできたようですが、2025 年 5 月現在ではお試しはなくなって最初から課金を要求されます。
最低 5 ドルなので、openAI にログインしてクレジットカードを登録して 5 ドルを課金します。

私の場合は、最初はクレジットカードを登録してもなかなか課金ができませんでした。おそらく openAI に何らかのバグがありますが、何故か突然課金できるようになりました。

API キーの作成

API キーを作成する必要があります。

openAI にログインして、右上の API referrence から「API keys」で検索するとキー作成画面が表示されるので、キーを作成します。
このキーは js スクリプトを動かすのに必要なのでエディタにメモします。

google スプレッドシート

どこかから単語リストをゲットします。これはネット上で公開している人がいるのでその中から適当に選んできます。
例えば、以下のような単語リストを csv で作成します。

google スプレッドシートにログインして、この csv をインポートします。

js スクリプトを作成

google スプレッドシートの画面で「拡張機能」→「Apps Script」を選択して以下のコードをペーストします。
この時、上で取得した API キーが必要になります。

function generateExamples() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const range = sheet.getRange('A2:A'); // A列の単語リストを取得
const words = range.getValues().flat(); // A列の単語を1D配列に変換
const apiKey = 'your_key'; // あなたのOpenAI APIキーをここに入力
// 単語ごとに例文を生成
words.forEach(function(word, index) {
if (word) {
const response = getExampleFromOpenAI(word, apiKey); // ChatGPT APIにリクエスト
const result = parseResponse(response); // APIのレスポンスから必要なデータを抽出
sheet.getRange(index + 2, 2).setValue(result.meaning); // B列に意味(和訳)を入力
sheet.getRange(index + 2, 3).setValue(result.example); // C列に英語の例文を入力
sheet.getRange(index + 2, 4).setValue(result.japaneseTranslation); // D列に和訳を入力
}
});
}
// OpenAI APIを使って、単語の例文と和訳を取得
function getExampleFromOpenAI(word, apiKey) {
const url = 'https://api.openai.com/v1/chat/completions'; // 新しいAPIエンドポイント
const messages = [
{
role: "system",
content: "You are a helpful assistant that provides word meanings, example sentences, and Japanese translations."
},
{
role: "user",
content: `Please provide the following for the English word "${word}":
1. A short Japanese meaning (単語の和訳, e.g., アワビ).
2. An example sentence using the word.
3. A Japanese translation of the sentence.
Return in this format:
Meaning: ...
Example: ...
Japanese Translation: ...`
}
];
const data = {
model: 'gpt-3.5-turbo', // 新しいモデル名
messages: messages,
max_tokens: 100,
temperature: 0.7
};
const options = {
method: 'POST',
contentType: 'application/json',
headers: {
'Authorization': 'Bearer ' + apiKey
},
payload: JSON.stringify(data)
};
const response = UrlFetchApp.fetch(url, options); // APIを呼び出して結果を取得
return JSON.parse(response.getContentText()).choices[0].message.content.trim(); // レスポンスを解析して返す
}
function parseResponse(responseText) {
Logger.log(responseText); // ★レスポンスの中身を見る
const lines = responseText.split('\n');
const meaning = lines[0]?.replace('Meaning: ', '').trim() || '';
const example = lines[1]?.replace('Example: ', '').trim() || '';
const japaneseTranslation = lines[2]?.replace('Japanese Translation: ', '').trim() || '';
return { meaning, example, japaneseTranslation };
}

これを実行すると以下のような csv ができます。

ただし、それなりに時間がかかるのと、google は 7 分程度でタイムアウトしてしまうので、一回あたり 350 個ほどしか作成できません。

私の場合は 7,000 ほど実行したのでかなり面倒でした。

作成された csv を一つずつダウンロードしてそれをまとめて一つの大きな csv ファイルを作成しました。

一つ注意すべきなのは、プログラムを実行するとスプレッドシートに上書きされるので、一旦エクスポートした後でスプレッドシートを一部削除して、もう一度プログラムを実行するようにします。

csv をデータベースにインポート

mysql でデータベースを作成して csv をインポートします。

私は phpmyadmin でインポートしました。

この際、csv のカラム数に注意する必要があります。

どういうわけかダウンロードされた csv はカラム数がバラバラなのです。

Terminal window
=== 01.csv ===
Line 1: 5 columns
Line 2: 5 columns
Line 3: 5 columns
Line 4: 5 columns
Line 5: 5 columns
Line 6: 5 columns
Line 7: 5 columns
Line 8: 5 columns
Line 9: 5 columns
Line 10: 5 columns
=== 02.csv ===
Line 1: 6 columns
Line 2: 6 columns
Line 3: 6 columns
Line 4: 7 columns
Line 5: 6 columns
Line 6: 6 columns
Line 7: 6 columns
Line 8: 6 columns
Line 9: 6 columns
Line 10: 6 columns

そのまま mysql にインポートしようとするとエラーが出てインポートできません。

しかし、これまたどういうわけかわからないのですが、例えば6列にする場合、1行目の5列目に5、2列目に 6 と入力するとそのままインポートできます。 つまり一行目しか問題にならない?

確認のためのプログラム

データベース化したのはいいのですが、よく見るとタイプミスがとても多い。

個人がネット上にアップしているものなので文句は言えませんが、私のダウンロードしたデータは猛烈にタイプミスが多くて困りました。

そこで、英単語が openAI 作成の例文中で使用されているかどうかを確認するプログラムを作りました。

<?php
try {
$dbh = db_connect();
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$statement = $dbh->query("
SELECT * FROM test
WHERE (example NOT LIKE CONCAT('%', word, '%') OR example IS NULL OR word IS NULL);
");
$result = $statement->fetchAll();
$statement = null;
$dbh = null;
} catch (PDOException $e) {
header('Content-Type: text/plain; charset=UTF-8', true, 500);
exit($e->getMessage());
}

13,000 以上の英単語をネット上に上げている人のエクセルをダウンロードしましたが、とてもそそっかしい人のようで 100 以上のタイプミスがあることがわかりました。

上のようなプログラムを使って、例文中の単語と比較するとある程度は効率的に編集することができます。

それにしても、google と openAI を使うとこれまでは考えられなかったスピードで、いろいろなものを作ることができるようになりました。 素晴らしいですね。