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?

ノーコードアプリみたいなものをコードありで作るなら?【QAC25 Day14】

0
Posted at

Day14 ノーコードアプリみたいなものをコードありで作るなら?

ここでのノーコードアプリは,あのキントーンさんみたいな感じの業務的なものを指していて,Scratchとかではありません.

今回の想定…

今回はアプリケーションの想定として,問い合わせフォームを想定しています.

問い合わせを行うユーザー側と,それの返信とかの管理を行う管理者側の2つの画面がある…そんなものを作っていきます.

という訳で

スクリーンショット 2025-12-15 000200.png

これ,普通の問い合わせフォームですよね.

誰かがこのフォームを送信すると…

スクリーンショット 2025-12-23 152505.png

おっメールが来ましたね😃

返信のURLとやらをクリックすると

スクリーンショット 2025-12-23 154105.png

更に返信を入れると…

スクリーンショット 2025-12-23 154328.png

…という訳で,以下のようにデータベース(スプレッドシート)に蓄積され,問い合わせ管理が出来ますね

スクリーンショット 2025-12-23 153149.png

つまり何が言いたいの?

Googleフォームとスプレッドシート,そしてもう1つを組み合わせることでノーコードアプリみたいなものが開発できるのさ!

で,その組み合わせるものがApps Scriptというプログラミング言語です.

はい,コードを使うことでノーコードアプリみたいなのが作れます.

特に何が言いたいかというと,Googleフォームに加えて一貫した管理ID,そして「フォームの事前入力URL」を使うことでかなり面白いシステムが出来上がります.

まずは

Googleフォームで適当にフォームを作りましょう.

右上の三点よりApps Scriptを押します.

スクリーンショット 2025-12-23 154930.png

次のコードが一応テンプレートになるのでよかったら使ってください.

/**
 * データベースとなるスプレッドシートのID  
 * (スプレッドシートURLの/spreadsheets/d/[ここ]/)
 * @type {string}
 */
const LIST_SPREADSHEET_ID = "";

/**
 * データベースとなるシートの名前
 * @type {string}
 */
const LIST_SHEET_NAME = "main";

/**
 * メールの送信先 (問い合わせが来たよって通知先)
 * @type {string}
 */
const MAIL_TO = "foo@example.com";

/**
 * メールの送信元 (すなわち自分のGoogleアカウント)
 * @type {string}
 */
const MAIL_FROM = "noreply@example.com";

const CheckAuth = () => {
  console.info("正常に権限が設定されており、使用できます。")
  return;
}

/** フォームに入力された値をパースして使いやすくするクラス */
class ContactFormItem {
  constructor(values, author) {
    this.id = Utilities.getUuid();
    this.author = author;
	  this.anyValue = this.getValue(values["anyValue"])
  }

  /**
   * フォームの入力値が`undefined`でも`string`として出すようにするもの
   * @param value {any} 値
   * @return {string} 値がundefinedで無ければその値、undefinedなら空文字
   */
  getValue(value) {
    return value ? value : "";
  }

  /**
   * フォームの値を取得するジェネレーター
   * 通常は`this.getValues()`でリストを取得する。
   */
  *_getValues() {
    /// この順番通りスプレッドシートに書き込まれる。
    yield this.id
    yield this.author
    yield this.anyValue
  }

  /**
   * フォームの値をリストとして取得するメソッド
   * @return {string[]}
   */
  getValues() {
    return [...this._getValues()]
  }
}

/**
 * スプレッドシートのIDからスプレッドシートデータを取得する関数
 * @param spreadSheetKey {string} スプレッドシートのID
 * @return Spreadsheet {SpreadsheetApp.Spreadsheet}
 */
const getSpreadSheet = (spreadSheetKey) => {
  var spreadsheet = SpreadsheetApp.openById(spreadSheetKey);
  return spreadsheet;
}

const onSubmit = (e) => {
  /// フォームから回答を取得する
  const form = FormApp.getActiveForm();
  const allResponses = form.getResponses();
  const latestResponse = allResponses[allResponses.length - 1];
  const response = latestResponse.getItemResponses();
  const author = latestResponse.getRespondentEmail();

  /// 最新の回答を取得
  let answers = {};
  for (var i = 0; i < response.length; i++) {
    var question = response[i].getItem().getTitle();
    var answer = response[i].getResponse();
    answers[question] = answer;
  }
  console.info(JSON.stringify(answers));

  const values = new ContactFormItem(answers, author);

  /// テーブルに書き込む
  const dbSpreadsheet = getSpreadSheet(LIST_SPREADSHEET_ID);
  const dbSheet = dbSpreadsheet.getSheetByName(LIST_SHEET_NAME);
  const insertRow = dbSheet.getLastRow() + 1;

  const insertValues = values.getValues()

  dbSheet.getRange(insertRow, 1, 1, insertValues.length).setValues([insertValues]);

  /// メールを送信する
  const mailBody = formatMailBody(values);
  GmailApp.sendEmail(MAIL_TO, "新規問い合わせが来ました", mailBody, {from: MAIL_FROM})
};

保存してトリガーを設定して権限チェックを行って…

まぁこのコードが完璧かというと多分完璧じゃないし…私の理想としては,せっかくonSubmitがイベントハンドラなんだからそのイベントを使って…

という訳で

これもアイデアの一つですが,GoogleフォームとAppsScript,スプレッドシートを使ってノーコード風アプリでも作ってみてはいかがですか?

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?