GASでスプレッドシートへデータを登録する|UUIDと日時も自動記録

公開日: 

GASでスプレッドシートへデータを登録する|UUIDと日時も自動記録。UUIDと登録日時・更新日時付きの作業依頼データを示すアイキャッチ

この記事では、GAS データ登録の基本として、第2回で作成した 作業依頼 シートへ、Apps Scriptから作業依頼データを1件登録します。

第3回ではまだWeb画面は作りません。Apps Scriptエディタから saveSampleRequest() を実行し、登録処理の基本になる saveRequest(data) を作ります。

1. 今回作るもの

今回作るのは、作業依頼データをスプレッドシートへ追加する登録処理です。

関数用途
saveSampleRequest()Apps Scriptエディタから実行する学習用関数
saveRequest(data)作業依頼シートへ1件登録する処理本体

saveRequest(data) は、後の回でHTMLフォームから呼び出す前提にします。

2. 完成イメージ

  • saveSampleRequest() を実行できる
  • 作業依頼 シートへ1行追加される
  • 内部IDにUUIDが入る
  • 登録日時と更新日時が自動で入る
  • ステータスに 未対応 が入る
  • 処理結果として成功・失敗のメッセージが返る

受付番号は第7回で作るため、今回は空欄のままにします。

3. 前回までの状態

前回は、GASでスプレッドシートを簡易データベースとして使う設計方法で、setupAppSheets() を作り、作業依頼管理アプリで使う6つのシートを作成しました。

まだ 作業依頼 シートを作成していない場合は、先に setupAppSheets() を実行してください。

シリーズ全体の構成は、第0回で紹介しています。

4. 使用するファイル

ファイル用途
Code.gs作業依頼データの登録処理

HTMLファイルはまだ使いません。入力画面は第4回、画面からGASを呼び出す処理は第5回で作ります。

5. スプレッドシート構成

今回登録する先は、作業依頼 シートです。

列項目今回入れる値
A内部IDUtilities.getUuid() で作成
B受付番号空欄
C登録日時new Date()
D更新日時new Date()
E顧客コードC002
F顧客名テスト工業
G件名見積書の作成
H依頼内容新規取引先向けの見積書を作成する
Iステータス未対応
J担当者佐藤
KPDF URL空欄
Lメール送信日時空欄
M削除区分空欄

6. 貼り付けるコード

Apps Scriptエディタの Code.gs に、記事本文のコードを貼り付けます。コード全文は complete.zip にも入っています。

function saveSampleRequest() {
  const result = saveRequest({
    customerCode: 'C002',
    customerName: 'テスト工業',
    title: '見積書の作成',
    description: '新規取引先向けの見積書を作成する',
    assignee: '佐藤',
  });

  Logger.log(result.message);
  return result;
}

function saveRequest(data) {
  try {
    validateRequestData_(data);
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = spreadsheet.getSheetByName('作業依頼');

    if (!sheet) {
      return {
        success: false,
        message: '作業依頼シートが見つかりません。先にsetupAppSheetsを実行してください。',
      };
    }

    const now = new Date();
    const id = Utilities.getUuid();

    sheet.appendRow([
      id, '', now, now,
      data.customerCode,
      data.customerName,
      data.title,
      data.description,
      '未対応',
      data.assignee || '',
      '', '', '',
    ]);

    return {
      success: true,
      id: id,
      message: '登録しました。',
    };
  } catch (error) {
    return {
      success: false,
      message: error.message,
    };
  }
}

function validateRequestData_(data) {
  if (!data) {
    throw new Error('登録データがありません。');
  }

  const requiredFields = [
    { key: 'customerCode', label: '顧客コード' },
    { key: 'customerName', label: '顧客名' },
    { key: 'title', label: '件名' },
    { key: 'description', label: '依頼内容' },
  ];

  requiredFields.forEach((field) => {
    if (!data[field.key]) {
      throw new Error(field.label + 'を入力してください。');
    }
  });
}

7. コードの解説

呼び出し側と登録処理を分ける

saveSampleRequest() は、登録に使う学習用データをオブジェクトにまとめ、saveRequest(data) に渡します。実行結果は result に受け取り、Logger.log(result.message) で実行ログにメッセージを出したあと、return result で呼び出し元へ返します。この関数はデータを用意して登録処理を呼び出し、シートへの書き込みは saveRequest(data) に任せます。

データを用意する処理と、シートへ保存する処理を分けておくと、呼び出し方を変えても登録処理を共通化できます。今回はApps Scriptエディタから saveSampleRequest() を実行しますが、登録本体は saveRequest(data) に集約しています。

書き込む前に必須項目を確認する

saveRequest(data) は、最初に validateRequestData_(data) を呼びます。この関数は、データ自体が渡されているかを確かめたうえで、顧客コード、顧客名、件名、依頼内容が空でないかを確認します。担当者は必須項目の一覧に含まれていないため、省略できます。省略した場合、登録行の担当者欄には空文字を入れます。

ここで行っているのは必須項目の有無の確認です。文字数や入力形式までは検査していません。必須項目が空なら Error を発生させ、後述する try...catch でエラーメッセージを返します。

続いて SpreadsheetApp.getActiveSpreadsheet() で対象のスプレッドシートを取得し、getSheetByName('作業依頼') で書き込み先を探します。シートが見つからないときは行を追加せず、「作業依頼シートが見つかりません。先にsetupAppSheetsを実行してください。」というメッセージを含む失敗結果を返します。

13列の見出しに合わせて1行を追加する

Utilities.getUuid() で内部IDを作り、new Date() で現在日時を取得します。同じ now を登録日時と更新日時の両方に使うため、新規登録時点では二つの日時が同じになります。内部IDはシステム内でレコードを識別する値で、今回のコードでは受付番号とは別に扱います。受付番号はまだ採番せず、空欄で登録します。

sheet.appendRow([...]) は、配列に並べた値をシートの最終行の次へ追加します。配列の順番は「作業依頼」シートの見出しと対応しています。

  • 内部ID には生成したID、受付番号 には空文字を入れる
  • 登録日時 と 更新日時 には now を入れる
  • 顧客コード、顧客名、件名、依頼内容 には data の各値を入れる
  • ステータス は 未対応 とし、担当者 には入力値があればそれを、なければ空文字を入れる
  • PDF URL、メール送信日時、削除区分 は、この回では空欄にする

このように、1件のデータを見出しと同じ列順で並べてから追加するのが、今回のシート登録処理です。列の順番と配列の順番がずれると別の項目の下に値が入るため、シートの列構成を変えるときは appendRow() に渡す配列も合わせて確認します。

成功・失敗の結果を呼び出し元へ返す

行を追加できると、saveRequest(data) は { success: true, id: ..., message: '登録しました。' } を返します。入力チェックでエラーが起きた場合や、保存処理で例外が発生した場合は catch が受け取り、{ success: false, message: ... } の形にして返します。作業依頼シートが見つからない場合も、同じく success: false を含む結果を返します。

呼び出し側は success で成否を判定し、message を画面やログに表示できます。今回の saveSampleRequest() はログへメッセージを出します。結果に内部IDも含めて返すため、登録処理を呼び出した側で登録されたレコードを識別できます。

この関数が後のフォーム登録の土台になる

この回では、固定のサンプルデータを渡して、シートへ1行追加するところまでを確認します。登録本体を saveRequest(data) として独立させているため、後の回ではフォームから受け取ったデータを同じ関数へ渡せます。第4回は入力画面の表示までを作り、第5回で google.script.run から saveRequest(data) を呼び出します。

つまり、今回作るのはエディタから一度だけ使う書き込み処理ではありません。「データを受け取り、必須項目を確かめ、列順に合わせて1行追加し、結果を返す」という登録の基本をまとめた関数です。呼び出し元がエディタでもブラウザのフォームでも、登録処理を重複して書かずに同じ関数を使えます。

8. 導入手順

  1. 第2回で作成した学習用スプレッドシートを開く
  2. メニューから 拡張機能、Apps Script を開く
  3. Code.gs に今回のコードを貼り付ける
  4. 保存する
  5. まだシートを作成していない場合は、setupAppSheets() を実行する
  6. 関数一覧から saveSampleRequest を選ぶ
  7. 実行する

9. GAS データ登録の動作確認

実行前の 作業依頼 シートは次のとおりです。

saveSampleRequest実行前の作業依頼シート。第2回のサンプル行のみ
第2回のサンプル行のみが入っている状態です。

実行後、作業依頼 シートの最終行にデータが追加されていれば成功です。実行ログに 登録しました。 と表示されることも確認します。

  • 内部IDに長いUUIDが入っている
  • 受付番号は空欄
  • 登録日時と更新日時に実行日時が入っている
  • 顧客コードに C002 が入っている
  • 顧客名に テスト工業 が入っている
  • 件名に 見積書の作成 が入っている
  • ステータスに 未対応 が入っている
  • 担当者に 佐藤 が入っている

第2回のサンプル行とは顧客と件名が違うため、追加された行を区別できます。

saveSampleRequest実行後の作業依頼シート。C002の行が追加された状態
C002/テスト工業/見積書の作成の行が追加されています。

実行ログに 登録しました。 と表示されていれば成功です。

saveSampleRequest実行後の実行ログ。登録しました。と表示
実行ログに登録完了メッセージが表示されています。

10. よくあるエラー

saveSampleRequest が関数一覧に出ない

コードを保存していない可能性があります。

作業依頼シートが見つからない

先に setupAppSheets() を実行してください。

登録データが増え続ける

saveSampleRequest() は、実行するたびに1行追加します。

受付番号が空欄になる

第3回では正常です。受付番号は第7回で実装します。

11. starter.zipの案内

starter.zip には、第2回完了時点の Code.gs と README.txt を入れています。

starter.zipをダウンロード

12. complete.zipの案内

complete.zip には、第2回までのシート作成処理と、第3回の登録処理が入っています。

complete.zipをダウンロード

13. 次回追加する機能

次回は、HTML Serviceを使って、ブラウザで表示できる入力フォームを作ります。




Your Message

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。

スポンサードリンク

記事が気に入ったらシェアお願いします

PAGE TOP ↑