0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google フォームを入力したらメールを返信する

0
Posted at

フォームを入力してもらったら、メールの自動返信を設定したい。

GAS を使って返信をする例が多く挙げられているが、みつけた例は文面をスクリプト内部に書き込んでいるようだ。

今回の利用シーンでは送る文面が長いのでスクリプトの外から文面を読み込ませたい。今回は、Google Document から TXTファイルを読み込み、それをメール文面とするスクリプトを ChatGPT で作り、設定してみた。

フォームの設定

「メールアドレスを収集」の設定をしておく

image.png

テキストファイルを作る

メール文面をTXTファイルにして Google Driveに保存。プレビューして URL の以下の箇所をコピー。

image.png

TXTファイルで保存できない場合はこちらを参照:
「Google Drive に .txt ファイルを保存する」
https://qiita.com/nanbuwks/items/f164e7b36e2cb4061cc0

スクリプトを設置する

フォームを表示し、メニューから「Apps Script」

image.png

image.png

以下をペースト。(ChatGPTで作成したもの)

/**
 * 設定
 */
const CONFIG = {
  // Googleドライブに置いたテキストファイルのID
  BODY_FILE_ID: 'ここにテキストファイルIDを入力',

  // 自動返信メールの件名
  SUBJECT: 'フォームへのご回答ありがとうございます',

  // フォームでメールアドレスを質問している場合の質問名
  // フォーム標準の「メールアドレスを収集する」を使う場合も、
  // 念のため設定しておいて構いません。
  EMAIL_QUESTION_TITLE: 'メールアドレス',

  // 送信者として表示する名前
  SENDER_NAME: 'フォーム事務局'
};


/**
 * フォーム送信時に実行される関数
 *
 * この関数はエディタから直接実行しないでください。
 * フォーム送信トリガーによって実行されます。
 */
function onFormSubmit(e) {
  if (!e || !e.response) {
    throw new Error(
      'フォーム送信イベントがありません。' +
      'onFormSubmitを直接実行せず、フォームから回答を送信してください。'
    );
  }

  const email = getRespondentEmail_(e.response);

  if (!email) {
    throw new Error(
      '回答者のメールアドレスを取得できませんでした。' +
      'フォームの「メールアドレスを収集する」を有効にするか、' +
      `「${CONFIG.EMAIL_QUESTION_TITLE}」という質問を作成してください。`
    );
  }

  const body = getMailBody_();

  MailApp.sendEmail({
    to: email,
    subject: CONFIG.SUBJECT,
    body: body,
    name: CONFIG.SENDER_NAME
  });
}


/**
 * 回答者のメールアドレスを取得する
 */
function getRespondentEmail_(formResponse) {
  // フォーム標準の「メールアドレスを収集する」を利用している場合
  const collectedEmail = formResponse.getRespondentEmail();

  if (collectedEmail) {
    return collectedEmail.trim();
  }

  // 質問項目としてメールアドレスを入力させている場合
  const itemResponses = formResponse.getItemResponses();

  for (const itemResponse of itemResponses) {
    const title = itemResponse.getItem().getTitle();

    if (title === CONFIG.EMAIL_QUESTION_TITLE) {
      const answer = String(itemResponse.getResponse()).trim();

      if (isValidEmail_(answer)) {
        return answer;
      }
    }
  }

  return '';
}


/**
 * Googleドライブのテキストファイルから本文を読み込む
 */
function getMailBody_() {
  const file = DriveApp.getFileById(CONFIG.BODY_FILE_ID);

  // UTF-8のテキストとして読み込む
  const body = file.getBlob().getDataAsString('UTF-8');

  if (!body.trim()) {
    throw new Error('メール本文のテキストファイルが空です。');
  }

  return body;
}


/**
 * 簡易的なメールアドレス形式チェック
 */
function isValidEmail_(email) {
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}


/**
 * 初回に一度だけ実行して、フォーム送信トリガーを作成する
 */
function setupTrigger() {
  const form = FormApp.getActiveForm();

  if (!form) {
    throw new Error(
      'このスクリプトをGoogleフォームの「Apps Script」から作成してください。'
    );
  }

  // 同じ関数の重複トリガーを削除
  ScriptApp.getProjectTriggers()
    .filter(trigger =>
      trigger.getHandlerFunction() === 'onFormSubmit' &&
      trigger.getEventType() === ScriptApp.EventType.ON_FORM_SUBMIT
    )
    .forEach(trigger => ScriptApp.deleteTrigger(trigger));

  ScriptApp.newTrigger('onFormSubmit')
    .forForm(form)
    .onFormSubmit()
    .create();

  console.log('フォーム送信トリガーを作成しました。');
}

6行目の以下の場所にIDを入力。

BODY_FILE_ID: 'ここにテキストファイルIDを入力',

IDは Google Drive のファイルID。先に取得したIDを使う。
image.png

保存しておく。

トリガ設定

「トリガー」-「新しいトリガーを作成します。」
image.png

以下のようにして「保存」
image.png

image.png

「Advanced」
image.png
としてプロジェクトを選択
image.png
権限を選択し「Continue」
image.png

テスト

フォームに入力テスト、メールが来ていればOK.

==========================================

EasyEDA でオートルーティング

image.png

image.png

image.png

image.png

環境
Windows 11 Pro
NAS LinkStation LS210D

NASにアクセス
いろいろ方法があるが、今回はゲストログオンを有効にする

gpedit.msc を起動し、以下の項目を選び有効に変更する。

image.png

以下の項目は無効に設定する。
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?