【第3部】Googleフォームで学会演題受付?きっと意外と便利です

学会の演題受付といえば、専用のオンラインシステムやメールでの受付が一般的かもしれません。しかし、小規模な研究会や予算が限られた学会では、Googleフォームを活用するという方法も選択肢のひとつです。

無料で使え、入力内容はそのままスプレッドシートに記録され、共有・管理も簡単。さらに、**Google Apps Script(GAS)**を使えば、手動で行っていた煩雑な作業を自動化することも可能です。


今回やりたいこと:演題受付番号の自動付番+区分ごとの接尾辞

Googleフォームを使った演題登録で、こんなふうにできたら便利だと思いませんか?

  • 演題受付時に 0001、0002…のように通し番号を自動で振る
  • 発表区分に応じて、末尾を「GO」「GP」「YIA」などで分類
  • 一度付けた番号が変更されないようにしつつ、区分だけが変更された場合には末尾のみ更新
  • 今後の処理(PDF出力やメール送信)のために、「送信ステータス」や「送信時刻」も記録

実はこれ、Google Apps Script を使えば簡単に実現できます


自動付番スクリプト(初心者向け解説つき)

以下は、演題受付番号(0001GO、0002YIAなど)を自動で振るスクリプトです。どの部分で何をしているのかをコメントで丁寧に説明しています。

function assignEntryNumbersAndInitStatus() {
// スプレッドシートの「フォームの回答 1」シートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 1');
const data = sheet.getDataRange().getValues(); // 全データを取得(2次元配列)
const header = data[0]; // 1行目(列の見出し)

// 必要な列のインデックス(何列目か)を探す
const entryCol = header.indexOf("演題受付番号"); // 演題受付番号の列
const categoryCol = header.findIndex(col => col.startsWith("発表区分")); // 発表区分
const statusCol = header.indexOf("送信ステータス"); // 後で使う、メール送信状況
const timeSentCol = header.indexOf("送信時刻"); // 後で使う、送信した日時

// 必要な列が見つからない場合、エラーを出して止める
if ([entryCol, categoryCol, statusCol, timeSentCol].includes(-1)) {
SpreadsheetApp.getUi().alert("必要な列が見つかりません。列名をご確認ください。");
return;
}

// 発表区分に応じた記号(末尾)を定義(部分一致で判定)
const categoryMap = {
"一般演題(口頭)": "Oral",
"一般演題(ポスター)": "Poster",
"YIA": "YIA"
};

// すでに登録されている最大の通し番号を調べる
let maxNumber = 0;
for (let i = 1; i < data.length; i++) {
const current = data[i][entryCol]; // 例:"0003GP"
if (current && current.startsWith('0')) {
const num = parseInt(current.slice(0, 4)); // 先頭4桁(0003)を数値として取り出す
if (!isNaN(num)) maxNumber = Math.max(maxNumber, num);
}
}

// データ行を1つずつ処理
for (let i = 1; i < data.length; i++) {
const currentEntry = data[i][entryCol]; // 現在の演題受付番号
const category = data[i][categoryCol] || ""; // 発表区分の内容

// 区分に応じた末尾(GOやYIA)を取得。見つからなければ"UNK"
let suffix = "UNK";
for (let key in categoryMap) {
if (category.includes(key)) {
suffix = categoryMap[key];
break;
}
}

// ===== 新規の登録:まだ番号が付いていない行 =====
if (!currentEntry) {
maxNumber++;
const newEntry = String(maxNumber).padStart(4, '0') + suffix; // 0001YIA などを生成
sheet.getRange(i + 1, entryCol + 1).setValue(newEntry); // 番号をセット
sheet.getRange(i + 1, statusCol + 1).setValue("未送信"); // ステータス初期化
sheet.getRange(i + 1, timeSentCol + 1).setValue(""); // 送信時刻は空に
}

// ===== 登録済みの行で、区分だけ変更された場合 =====
if (currentEntry) {
const prefix = currentEntry.slice(0, 4); // 数字部分を取り出す(0001)
const newEntry = prefix + suffix; // 新しい形式を組み立て(0001GO など)
if (currentEntry !== newEntry) {
sheet.getRange(i + 1, entryCol + 1).setValue(newEntry); // 変更された場合だけ上書き
}
}
}
}

ポイント解説

  • SpreadsheetApp.getActiveSpreadsheet():現在開いているスプレッドシートを取得します
  • header.indexOf(...)findIndex(...):列名から、何列目かを探します(0から始まる数)
  • maxNumber:すでに付与された番号のうち、一番大きいものを探しています
  • .padStart(4, '0'):番号を4桁に揃えるため、足りない桁に「0」をつけます(例:1 → 0001)
  • "未送信"や送信時刻は、今後メールを送信する際に使うための情報です
  • このスクリプトを使えば、
  • 入力されるたびに、一意の演題番号が自動的に割り振られ、
  • 発表区分に応じた文字(紹介コードではOral, Poster, YIA)を末尾につけられ、
  • 今後の作業(PDF出力やメール)に向けて、状態を記録しておく準備ができます。


「送信ステータス」「送信時刻」は何に使うの?

このスクリプトの中には、**「送信ステータス」や「送信時刻」**を記録するコードも含まれています。

これは後のステップ(たとえば、自動メール送信する処理)で、

  • すでにメールを送信したかどうかを判定
  • フォームの内容が更新されたときだけ再送信

といった制御をするための準備です。将来を見据えた設計として、最初の時点でステータス管理の列を作っておくことをおすすめします


設定手順まとめ

  1. Googleフォームを作成し、演題登録を受け付ける
  2. フォームの回答先スプレッドシートを開く
  3. 拡張機能 → Apps Script を開いて、上記スクリプトを貼り付け・保存
  4. 手動でスクリプトを一度「実行」して動作を確認
  5. 必要に応じて「トリガー(フォーム送信時)」を設定して自動化


おわりに

Googleフォーム + スプレッドシート + Apps Script を使えば、ちょっとした工夫で演題受付業務が大幅に効率化されます。

特に少人数で運営する学会や、学内イベントなどでは、こうした方法が大きな助けになります。

次回は、登録された演題情報から「抄録PDFを自動作成」する方法をご紹介します!

コメント

タイトルとURLをコピーしました