るぴブロ

備忘録とかです(*'ω'*)

Google Formでログインなしで登録時に重複を削除する

こんばんは。

昨日の続きです!

実現したい事

  • Google Formで時間帯予約フォームを作成

  • 予約データをスプレッドシートと連携

  • 各時間帯には上限があり残席数を知らせたい(予約できなくする等の制限は不要)

  • 登録時にユーザーIDを入力してもらい予約のキャンセル/変更ができる

  • スプレッドシートのデータを検索し現在の登録状況を検索/表示する事ができる

  • ユーザーはスマホWebブラウザからのアクセスのみ(ガラケは無視でおk)

  • 尚、ユーザーはGoogleアカウントでログインしない事とする(震

 

はじめに・・・

正直今回は苦肉の策と言いますか、ユーザー次第的なところが強いので、あまりオススメできません。(泣

一度登録した内容を編集したい場合や、回答の重複を避けたい場合はGoogleアカウントでログインして頂く事を強くオススメします。

hep.eiz.jp

 

どうしよう・・・

今回、要件にユーザーの方にはGoogleアカウントでログインしないとあったので、どうしたものか考えに考えた結果、ユーザの方には予め決められたユーザーIDを入力してもらい、GASを使ってGoogle Formのリクエスト送信時に同じIDが過去に登録されていた場合は古いIDのレコードを削除するといったものにしました。

Google Formはスプレッドシートと連携必須

 

懸念事項

スプレッド上のレコードを削除する為、Google Formの回答とスプレッドシートのレコードがアンマッチになる

ユーザーIDを少しでも間違えて入力したら積む

 

とりあえず実装してみる

function myFunction() {

  var id = '***ここにスプレッドシートのIDを入力***';
  var answer_sheetname = '回答';
  var cansel_sheetname = 'キャンセル';
  
  //シートの読み込み
  var spsheet = SpreadsheetApp.openById(id)
  var answer_sheet = spsheet.getSheetByName(answer_sheetname);
  var cansel_sheet = spsheet.getSheetByName(cansel_sheetname);  
  //最終行の取得
  var answer_lastrow = answer_sheet.getLastRow();
  var cansel_lastrow = cansel_sheet.getLastRow()+1;
//直前に入力したレコードよりユーザーIDを取得 var userid = answer_sheet.getRange("B"+answer_lastrow).getValue(); //対象useridの行を取得 var rowPosition = findRow(answer_sheet,userid,2); //最終行と一致する場合は重複なしとみなす if(rowPosition === answer_lastrow){ return; } //取得した回答データをキャンセルシートに貼り付け answer_sheet.getRange('A'+rowPosition+':L'+rowPosition).copyTo(cansel_sheet.getRange('A'+cansel_lastrow+':L'+cansel_lastrow)); //元データを行ごと削除 answer_sheet.deleteRow(rowPosition); } function findRow(sheet,val,col){ var dat = sheet.getDataRange().getValues(); for(var i=1;i<dat.length;i++){ if(dat[i][col-1] === val){ return i+1; } } return 0; }

 

こんな感じです。

データを削除しようと思ったのですが、後から削除したデータはどんなものだったのか?と言うのを確認できる様にキャンセルシートを用意し、レコードを移動するイメージで作成してみました。

苦しい感じですが、以下の様な処理を行なっています。

  1. 自身のスプレッドシートから回答シートとキャンセルシートを取得
  2. 直前に入力したレコードよりユーザーIDを取得
  3. findRow関数で対象のユーザーIDを含むレコードが存在するかチェック
  4. 対象レコードが存在した場合、キャンセルシートにレコードをコピペ
  5. 回答シートよりコピペしたレコードを削除

2の直前に入力したレコードよりユーザーIDを取得したところで、複数ユーザーが同時にフォームに入力した場合はどうなるのか同僚にお願いして何度かテストしましたが、40回ほど実験して100%自身の入力したレコードだったので大丈夫かと怪しい処理を書いてますwww

 

まとめ

  • 今回の方法は絶対にオススメしません
  • 重複を削除したい場合はGoogleアカウントでログインしましょう

 

まぁ結果はともあれ、良く頑張った!!と思うwwww