【Google Apps Script (GAS)】Googleフォームの回答先スプレッドシートを切り替えるツール

2019年1月2日Google Apps

Gooleフォームには回答をスプレッドシートに出力する機能があります。
今回は別のGoogleフォームを使って、回答を出力しているスプレッドシートを切り替えてしまおうという狙いです。

同じフォームを使いまわして、回答先のスプレッドシートだけ切り替えたいという場面があり、こんなツールを作ってみました。

メリット/デメリット

スポンサーリンク

Googleフォームはスマホアプリがリリースされていないので、回答先のプレッドシートを切り替えるにはパソコンから操作する必要があります。
出先でサクッと切り替えたい時には少し手間かもしれません。(それでも作業的には3回クリックくらい)

Googleフォームを使うとスマホの画面に適した表示を自動でやってくれるので、あとはScriptに処理させるといった具合に実装することでスマホから回答先スプレッドシートを切り替えることができます。

デメリットとしては例えば一回だけのイベントのような場面では使い所がありません。。。

用意するもの

①アンケート用のGoogleフォーム:今回はテスト的に作ります。質問などはなんでもOKです。

②スプレッドシート切り替え処理を実装するためのGoogleフォーム:こちらが今回の本命です。画面自体は送信ボタンがあればOKです。

処理概要

スポンサーリンク

処理の概要は下記のようになっています。

①IDを使ってGoogleフォームオブジェクトを取得する
②取得したGoogleフォームオブジェクトから回答先スプレッドシートを取得する
③Googleフォームとスプレッドシートのリンクを外す
④リンクを外したスプレッドシートをリネーム
⑤フォームに残っている回答を削除
⑥新しいスプレッドシートを作成する
⑦フォームにリンク付けする
⑧余計なシートを削除する

⑧はスプレッドシートを作った時にできる「シート 1」というシートをここでは無くしたかったので削除しています。
有っても問題なくフォームの回答を連携できますのでお好みです。

⑥のスプレッドシートを作成する処理は他でも使えそうなので、ファンクション化しました。

実装

スプレッドシートを切り替える処理

[フォームのID]は「アンケート用のGoogleフォーム」のIDに、[フォルダのID]は回答先のスプレッドシートを格納するフォルダのIDを指定してください。

function myFunction(e) {
  // フォームオブジェクト
  var form = FormApp.openById([フォームのID]);
  // 回答先スプレッドシートを格納しているフォルダ
  var folder = [フォルダのID];
  
  
  // 回答先スプレッドシートを取得する
  var old_ss = SpreadsheetApp.openById(form.getDestinationId());
  
  // 回答先リンクを外す
  form.removeDestination();
  
  // リンクを外したスプレッドシートの名前を変更する
  old_ss.rename('old_' + old_ss.getName());
  
  // フォームに残っている回答を削除
  form.deleteAllResponses();
  
  // 新しいスプレッドシートを作る
  var new_ss = createSpreadsheet(form.getTitle() + '(回答)', folder);
  
  SpreadsheetApp.flush();
  
  // フォームにリンク付する
  form.setDestination(FormApp.DestinationType.SPREADSHEET, new_ss.getId());
  
  // 余計なシートを削除
  new_ss.deleteSheet(new_ss.getSheetByName('シート1'));
}

スプレッドシートを作成したあと、リンクの紐付けとシート削除するためには、SpreadsheetApp.flush();を実行して一度更新しないとダメみたいです(>_<)

スプレッドシートを作成する

こちらは後々使えそうなのでファンクション化してます。
指定のフォルダに指定した名前でスプレッドシートを作成します。

function createSpreadsheet(ssName, folderId) {
  var folder = DriveApp.getFolderById(folderId);
  var ss = 0;
  if (folder.getFilesByName(ssName).hasNext()) {
    Logger.log(ssName+"があります");
  } else {
    Logger.log(ssName+"を作成");
    var ssId = SpreadsheetApp.create(ssName).getId();
    var file = DriveApp.getFileById(ssId);
    folder.addFile(file);
    DriveApp.getRootFolder().removeFile(file);
    var ss = SpreadsheetApp.openById(ssId);
  }
  return ss;
}

感想

スポンサーリンク

出席確認用にGoogleフォームを使っていて、フォームは毎回同じで回答先だけ変えたかったので毎回PCからフォーム編集画面を開いて操作していたので手間でした。。。
これを作ってからはスマホで移動中にサクッとできちゃいます♪

Googleフォームを使ってツールを作ると楽に色々と作れるかも♪

「②取得したGoogleフォームオブジェクトから回答先スプレッドシートを取得する」の部分をライブラリ化することで、Googleフォームの回答先スプレッドシートを切り替えるツール以外にも活躍しそうです。