業務自動化で脱・手作業!一人事務のDX活用術 | RPA・自動化ツール

業務自動化で脱・手作業!一人事務のDX活用ブログ|RPA・自動化ツールで業務をもっとラクに、もっとスマートに

ChatGPT×Googleフォームで簡単レコーディングダイエット|食事&体重管理をやさしく継続

ゴールデンウィークなどの連休中、ついつい食べすぎてしまった……という方は多いのではないでしょうか。

ダイエットアプリやAI連携の体重計も便利ですが、「記録が面倒」「継続できない」という理由で挫折してしまうこともあるでしょう。筆者もその一人です。

そこで今回は、GoogleフォームとChatGPTを組み合わせて、手軽に続けられる「レコーディングダイエット支援ツール」を自作してみました。
ポイントは、「AIがやさしく寄り添ってくれる」こと。厳しい言葉ではなく、“ちょっとした気づき”をくれるアドバイスなら、日々の記録も負担になりません。


Googleフォーム×ChatGPTでつくる!ダイエット記録システム

以下の手順で誰でも簡単に始められます。

Googleフォームを作成

Googleドライブから「+新規」→「Googleフォーム」を選択。

② 質問項目を設定

  • 【種別】朝・昼・晩・体重記録のみのプルダウン

  • 【内容】食べたものを自由記述

  • 【体重】任意回答欄(kg)

Googleスプレッドシートと連携

フォームの「回答」タブからスプレッドシートを生成。

④ GAS(Google Apps Script)を記述

スプレッドシートより拡張機能→Apps Scriptを開き、ChatGPT APIと連携するコードを記述します(※ブログの一番下部に記載しています)。

⑥ トリガー設定

「フォーム送信時」にGASを動かすようにトリガーを設定します。


実際のChatGPTアドバイス

最初のプロンプトは以下のように設定しました。

あなたはダイエットと栄養の専門家です。
以下の食事内容について、ダイエットおよび栄養学の観点からアドバイスを出してください。
できれば前向きな表現や励ましの言葉も含めてください。

結果はこちら👇

……うん、正論だけどちょっと厳しい😢
そもそも朝にジャムパン食べるような人間は、もう確信犯なんですよ(笑)。


プロンプトを調整して“やさしいAI”に育てる

というわけで、プロンプトを以下のように変更しました。

以下の食事内容に対して、ダイエットの視点を含みつつ、やさしい気づきや提案を1〜2文で伝えてください。
上から目線にならず、否定的にならず、前向きで寄り添う言い方をしてください。
「わかっていてもできない日もある前提」でお願いします。

このくらいなら素直に受け入れられますよね。「怒られてる感」がないのが継続のコツです。

なお、gpt-3.5-turboよりもgpt-4の方がやさしい傾向があり、プロンプトの意図を汲んでくれやすい印象でした。ただし、今回はコストを抑えたいという理由で、今回はgpt-3.5-turboを調教(笑)して使用しています。


体重記録機能も追加!

フォームの「種別」で「体重記録」を選び、体重記録欄に体重を入力(スプレッドシート体重記入欄(F列))に基づいて以下のようなメッセージも自動送信されます。

こちらはChatGPTではなく、GAS内で差分を計算し、固定文言を分岐で送信しています。体重管理をもっと柔軟にしたい場合は、GPTでその日の流れや傾向を分析させるよう拡張も可能です。


まとめ:ゆるっと続けられる仕組みが最強!

「ちゃんとやらなきゃ」と思うほど、続かないのがダイエット。
でも、“少し寄り添ってくれるAI”がいるだけで、不思議と記録したくなるんです。

GoogleフォームとChatGPTを組み合わせれば、コストも低く、自分に合った“ゆるいダイエット記録”が実現できます。

まずは朝ごはん1つから。
あなたも、AIと一緒にゆるっと記録、始めてみませんか?

▼GASとChatGPTの連携でさらなるカスタマイズをしたい方はこちらの書籍もおすすめです。

ChatGPT APIをGoogleスプレッドシートで関数化!=GPT()で要約・分類が一発|AI関数で正規表現不要な時代へ

Google Apps Script × ChatGPTのツボとコツがゼッタイにわかる本

新品価格
¥1,960から
(2025/4/5 11:45時点)

▼ 役に立ったらブックマークお願いします!

ChatGPT APIをGoogleスプレッドシートで関数化!=GPT()で要約・分類が一発|AI関数で正規表現不要な時代へ

ChatGPT APIをGoogleスプレッドシートで関数化!=GPT()で要約・分類が一発|AI関数で正規表現不要な時代へ
人気ブログランキング

<gascode>

const OPENAI_API_KEY = 'sk-*********************'; // ← OpenAIのAPIキーを入力
const GOAL_WEIGHT = 50.0; // ← ご自身の目標体重(kg)を設定

function onFormSubmit(e) {
  const email = e.values[1];
  const mealType = e.values[2]; // あさ・昼・晩・体重記録
  const mealContent = e.values[3]; // 食べたもの
  const weight = e.values[5]; // 体重(任意)

  let messageParts = [];

  // 食事記録がある場合(体重記録でなく、かつ記入あり)
  if (mealType !== '体重記録' && mealContent) {
    const prompt = `
あなたはダイエットと栄養の専門家です。
以下の食事内容に対して、ダイエットの視点を含みつつ、やさしい気づきや提案を1〜2文で伝えてください。
上から目線にならず、「次に活かせそうなちょっとしたヒント」を伝えるようにしてください。
改善点があっても否定的にならず、前向きで寄り添う言い方をしてください。
わかっていてもできない日もある前提で、寄り添いながらアドバイスしてください。

■食事の種別: ${mealType}
■内容: ${mealContent}
    `;
    const advice = getGPTResponse(prompt);
    messageParts.push(`【${mealType}の記録】\n${mealContent}\nアドバイス:\n${advice}`);
  }

  // 体重記録がある場合(数値が入っているか)
  if (weight && !isNaN(parseFloat(weight))) {
    const weightNum = parseFloat(weight);
    const diff = (weightNum - GOAL_WEIGHT).toFixed(1);
    const weightMessage = generateWeightMessage(weightNum, diff);
    messageParts.push(`【体重記録】\n現在の体重: ${weightNum}kg\nコメント:\n${weightMessage}`);
  }

  // どちらか記録があったらメール送信
  if (messageParts.length > 0) {
    const fullMessage = messageParts.join('\n\n');
    sendAdviceEmail(email, '今日の記録', '', fullMessage);
  }
}

function generateWeightMessage(currentWeight, diff) {
  if (diff > 0) {
    return `目標体重まであと${diff}kgですね。少しずつでも続けていけば、ちゃんと近づいていきますよ!応援しています!`;
  } else if (diff < 0) {
    return `目標より${Math.abs(diff)}kg軽くなっています!すごいですね!維持できるように無理せず過ごしていきましょう!`;
  } else {
    return `目標体重ちょうどですね!おめでとうございます!この調子でバランスよく続けていきましょう!`;
  }
}

function getGPTResponse(prompt) {

  const payload = {
    model: 'gpt-3.5-turbo', // 必要に応じて gpt-4 に変更可
    messages: [{ role: 'user', content: prompt }],
    temperature: 0.7
  };

  const options = {
    method: 'post',
    contentType: 'application/json',
    headers: {
      Authorization: `Bearer ${OPENAI_API_KEY}`
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  const response = UrlFetchApp.fetch(url, options);
  const json = JSON.parse(response.getContentText());
  return json.choices[0].message.content.trim();
}

function sendAdviceEmail(email, type, content, advice) {
  const subject = `【アドバイス${type}`;
  const body = `
こんにちは!
ご記入いただいた内容について、コメントをお届けします。

${advice}

記録、おつかれさまです!明日もゆるっとがんばっていきましょう!
`;

  GmailApp.sendEmail(email, subject, body);
}