Google Apps Script でよく使う機能を関数としてまとめてみた

Google Apps Script (GAS) は面倒な作業の自動化や、スプレッドシートの簡易データベース化などの様々な場面で世話になるプラットフォームです。GAS では V8 ランタイムが使えるため、フロントエンドエンジニアは JavaScript と同じように GAS を書くことができます。ここでは GAS でよく使う機能を関数としてまとめました。

GET リクエストを受け取る

GET リクエストを受け取るのは doGet という決まった関数名になります。

/**
 * @see https://developers.google.com/apps-script/guides/web
 */
function doGet(e) {
  const { queryString, parameter, parameters, postData } = e;
  const queries = [...new URLSearchParams(queryString).entries()].reduce((obj, e) => ({...obj, [e[0]]: e[1]}), {});
}

POST リクエストを受け取る

POST リクエストを受け取るのは doPost という決まった関数名になります。

/**
 * @see https://developers.google.com/apps-script/guides/web
 */
function doPost(e) {
  const { queryString, parameter, parameters, postData } = e;
  const { length, type, contents, name } = postData;
  const json = JSON.parse(contents);
}

Google Forms の送信イベントを受け取る

Google Forms では、GAS でフォームをイベントのソースとすることで、フォーム送信後に自動返信メールを送信したりすることができます。フォームイベントのレスポンス FormResponse では、フォームを送信したユーザーのメールアドレスやフォームの回答項目を取得することができます。

function onFormSubmit(e) {
  // 回答ID、タイムスタンプ、メールアドレスは以下のようにして取得します.
  const id = e.response.getId();
  const timestamp = e.response.getTimestamp();
  const email = e.response.getRespondentEmail();

  const itemResponses = e.response.getItemResponses();

  // デバッグ用に回答項目のログを出力.
  itemResponses.map((itemResponse, i) =>
    Logger.log('Response #%s to the question "%s" was "%s"',
      (i + 1).toString(),
      itemResponse.getItem().getTitle(),
      itemResponse.getResponse()
    )
  );

  // フォームの項目が3つある場合は以下のようにして回答内容を取得できる.
  const [value1, value2, value3] = itemResponses.map(itemResponse => itemResponse.getResponse());
}

HTML メールを送信する

HTML メールの送信には HtmlServicecreateTemplateFromFile を利用します。このメソッドに HTML ファイル名を渡し、同名のファイルを作成してそこに HTML メールの内容を記述します。また HtmlTemplate オブジェクトにプロパティを生やすことで、HTML メールのテンプレートに GAS の変数の値を渡すことができます。

// main.gs
function onFormSubmit(e) {
  const to = 'user@example.com';
  const from = 'info@example.com';

  const template = HtmlService.createTemplateFromFile('message');
  template.to = to;

  const htmlBody = template.evaluate().getContent();
  const subject = 'お問合せいただきありがとうございます';
  const body = htmlBody.replace(/<[^>]*>?/gm, '');
  const options = { from, htmlBody };

  GmailApp.sendEmail(to, subject, body, options);
}

HTMLメールのテンプレートとなる message.html は以下のようになります。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <p><?=email?></p>
    <p>いつも大変お世話になっております。<br>◯◯◯◯カスタマーサポートでございます。</p>
    <p>この度はお忙しい中アンケートにご協力いただきまして、<br>誠にありがとうございました。</p>
    <p>いただきましたご意見、ご要望を、<br>今後のサービスや業務改善に役立てて参ります。</p>
    <p>今後ともご愛顧賜りますよう、よろしくお願い申し上げます。</p>
  </body>
</html>

Spreadsheet のシートを作成/選択する

sheetName という名前のシートがあればそのシートを、なければその名前でシートを作成する関数はこのようになります。

function getSpreadSheet(sheetName) {
  const ss = SpreadsheetApp.getActive();
  const sheet = ss.getSheetByName(sheetName)
  if (sheet) return sheet;
  return ss.insertSheet(`${sheetName}`)
}

関数の呼び出し元では

const sheet = getSpreadSheet('シート名1');
if (sheet.getDataRange().isBlank()) sheet.appendRow(['ヘッダー1', 'ヘッダー2', 'ヘッダー3']);

のように使うことができます。新規作成された場合はシートが空のため、値が存在するセルの範囲を返す getDataRange が空になります。そのためここでは sheet.getDataRange().isBlank() で空のシートかどうかを判定してヘッダーを挿入する、といった操作をおこなっています。

XML ファイルをパースする

外部リソースの取得は UrlFetchApp、XML のパースは XmlService を利用します。

function parseXml(url) {
  const xml = UrlFetchApp.fetch(url).getContentText();
  const document = XmlService.parse(xml);
  const root = document.getRootElement();

  const channel = root.getChild('channel');
  const entries = channel.getChildren('item');
  return entries.map(entry => ({
    title: entry.getChild('title').getText(),
    link: entry.getChild('link').getText(),
    pubDate: entry.getChild('pubDate').getText(),
    guid: entry.getChild('guid').getText(),
    categories: entry.getChildren('category').map(category => category.getText());
  }));
}

コメントを残す

メールアドレスが公開されることはありません。