見出し画像

Googleフォームの入稿を自動化した話

どうもエンジニアのgamiです。

先日、「日曜エンジニア」を増やしたいという記事を書きました。

ありがたいことにTwitterでもいくつか反応をいただきました。

さて、最近の仕事でGoogleスプレッドシートの内容からGoogleフォームを自動生成するためのGoogle Apps Scriptを書きました。これなんかは、まさに「日曜エンジニア」っぽい活動だなーと思いました。

このnoteマガジンは、どうにも抽象的な話に終止しがちです。今回は、実際に僕が体験した自動化の事例について紹介します。その試行錯誤のプロセスを読んで、みなさんが「自分でも似たようなことやってみたい!」と思ってもらえたら嬉しいです。


どんなときに自動化したくなるか?

「日曜エンジニア」としての主戦場は、作業の自動化です。抽象的に言えば、プログラミングとはコンピュータに仕事をさせるための命令文を書くことです。自分がやりたくない仕事をコンピュータに任せる「自動化」は、まさにプログラムによって実現されます。

最近、仕事で自社プロダクトの理解度をチェックするための試験問題を量産する機会がありました。問題形式は正誤判定で、次の画像のようにGoogleスプレッドシートに作りためていました。

スクリーンショット 2021-10-28 8.19.40

(問題内容はサンプルです)

試しに社内メンバーにテスト問題を受けてもらおうと思ったとき、選択肢は2つありました。

A. Googleスプレッドシートでシートを複製し、シートに直接回答を書いてもらう
B. Googleフォームに問題を入稿し、フォームで回答してもらう

A案の方が作業は明確です。しかし、社内メンバーの数だけシートを複製する必要があり、管理や集計が面倒になりそうです。

B案であれば、一度Googleフォームに問題を入稿してしまえば回答者が何人増えても手間はあまり変わりません。回答結果もGoogleフォーム上の機能で見やすく表示することが出来ます。

問題があるとすれば、200問近くある問題を手作業でGoogleフォームに入稿するなんてとてもやりたくないということです。入稿に1問5秒かかるとしても、約17分かかります。しかも、問題を訂正する度にGoogleフォーム側への入稿作業が発生するので、その「17分」が何回発生するかわかりません。

ということで、僕はGoogleフォームの自動入稿について調べ始めます。

エンジニアだって楽がしたい

みなさんの中には、エンジニアであればどんな自動化でも自ら書いたプログラムで簡単に実現するんじゃないかと思う人もいるかもしれません。しかし、プログラマーの三大美徳の一つは「怠慢」です。誰かが書いているプログラムを流用できるなら、その方が楽で良いに決まっています。OSSだって、その「怠慢」の気持ちが無ければここまで広まっていません。

Googleフォームの自動入稿をしたいときに、まず考えたのは次の選択肢です。

a. Googleフォームの機能を使って問題をインポートできないか?
b. 無料で使えるSaaSの機能で入稿を自動化できないか?
c. 自分でプログラムを書いて自動化できるか?

最初は、天下のGoogleフォームであれば自動入稿機能もあるだろうと高をくくっていました。しかし、「Googleフォーム 入稿 csv」とか「Googleフォーム 入稿 スプレッドシート」などと調べても、フォームの回答結果データを扱う方法についての記事しかヒットしませんでした。Googleフォームで設定できる設問の形式には、かなりの種類があります。その種類全てに対応するには、きっとcsvやスプレッドシートなど単純な表形式のデータによる入稿は難しいのだと思います。

調べていくうちに、Google Apps Script(GAS)を使えばできそうだということまではわかりました。

諦めきれずに、GASを直接書かなくてもいい方法も調べました。SaaS百花繚乱の時代、Googleフォームの入稿くらいなら自動化してくれるSaaSもありそうです。しかしさらっと調べた感じでは、良さそうなSaaSは見つかりませんでした。

この辺りから、「これ以上調査するよりもGAS書いた方が早いわ」という気持ちになってきます。

よろしい、ならばプログラミングだ

いよいよ、最後の手段である「自分でプログラムを書いて自動化できるか?」について考えます。

ここまでで、どうやらGASを書けばGoogleスプレッドシートの読み込みもGoogleフォームへの設問追加もできそうだということがわかりました。

ちなみに、「プログラムを書けば自動化できる」というのは決して当たり前のことではなくて、GoogleさんがスプレッドシートやフォームのAPIをたくさん提供しGASから簡単に実行できるように環境を整えてくれているから実現できることだったりします。自動化の仕組みもAPIも存在しないソフトウェアで自動化を実現したい場合、基本的には、RPAと呼ばれる過渡期の技術を使うか諦めるかしかありません。

さて、ここまで来てもいかに楽にプログラムを書けるかを考えます。具体的には、自分がやりたいことに近い内容を紹介している記事を探し、プログラムをコピペできないか考えます。どこまでも楽がしたい。

ということで、「googleフォーム gas 入稿」などと検索します。ちなみに、GAS関連はユーザーの裾野が広い分、品質の低い記事もたくさんあります。そんなときは、たとえばQiitaなどにプラットフォームを絞って検索すると、エンジニアっぽい人が書いた記事の割合が増えて幸せです。

たとえば、↓のようなありがたい記事を発見できます。

記事のスクリプトをGASにコピペしたら、プログラムの中身を解読します。このとき、Google側が用意してくれたAPIメソッドについてはよくわからないので、公式のリファレンスを見たりします。この辺りは、一定の知識や経験が必要なポイントですね。

そうして書いたGAS用のJavaScriptプログラムが、こちらになります。

function makeForm() {
   // スプレッドシートのシート名
   const SHEET_NAME = 'questions';
   // GoogleフォームのID(URLから取得)
   const FORM_ID = '1X8xtiuVE_qofh7WzmIid-bxb3nR557QrJYuSqwjdlb8';
   // 1問当たりの配点
   const POINT = 1;

   const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
   // シートの最終行の番号を取得
   const lastRow = sheet.getLastRow();
   Logger.log('@@@lastRow: ' + lastRow);

   const form = FormApp.openById(FORM_ID);

   // 既存の設問を削除
   clearForm(form);
   // フォームのクイズモードをONにする
   form.setIsQuiz(true);

   // シートにある行の数だけ処理を繰り返す
   for (let i = 2; i <= lastRow; i++) {
       // シートの各列のデータを1件ずつ取得
       const about = sheet.getRange(i, 2).getValue();
       const isCorrect = sheet.getRange(i, 3).getValue();
       const choice = sheet.getRange(i, 4).getValue();
       Logger.log('@@@about: ' + about + ', :isCorrect: ' + isCorrect + ', choice: ' + choice);

       // ラジオボタンの設問を追加
       const mcItem = form.addMultipleChoiceItem();
       mcItem.setTitle(about + 'について、' + choice);
       mcItem.setPoints(POINT);
       mcItem.setChoices([
           mcItem.createChoice('正しい', isCorrect),
           mcItem.createChoice('正しくない', !isCorrect),
       ]);
   }
}

// 既存の設問を自動で全部消す関数
function clearForm(form) {
   const items = form.getItems();
   const l = items.length;
   for (let i = 0; i < l; i++) {
       form.deleteItem(items[i]);
   }
}

説明の都合上端折ってますが、実際は最初から完璧なコードが作れるわけではありません。ちょっとずつ書き足して、試しに実行して、エラーログが出た箇所を直して、入稿されたフォームに問題があればさらにプログラム直して、みたいな試行錯誤の末に上記のコードは出来上がっています

ちなみに、こうしたデバッグをやりやすくするために、ログを出力する処理も含めています。プログラムでいうと、Logger.log('...');というやつです。

これをスプレッドシート側の「ツール > スクリプトエディタ」から登録し、シート名やフォームIDを実際のものに変更してデプロイします。

スクリーンショット 2021-10-28 9.20.11

実行すると、シート側のデータから次のフォームが自動生成できます。

スクリーンショット 2021-10-28 8.19.40
スクリーンショット 2021-10-28 9.19.13

なおプログラムが完成したあとで、設問の削除機能も欲しくなって付けました。シート側を変更してGASを再実行すると、フォームの既存の設問を一度全部消してから再入稿してくれます。

NoCodeを待つか、JavaScriptを書くか

以上が、僕が最近体験した自動化でした。

NoCodeが流行っている現状でも、こんなよくありそうな自動化でさえJavaScriptを書かないとできなかったりします。逆に言えば、簡単なプログラムが書けると自動化を諦めなくてもいい局面が増えます

もちろん、社内外のエンジニアに自動化を依頼するということもできるでしょう。しかしこうした業務の自動化は、その業務の辛さに実際に直面している人が強く推進しないと優先順位がどんどん下がります。依頼を受けるエンジニアとしても、自分と関係ない業務を自動化する仕事は「やらされ感」が強くなり、価値実感が得にくいところです。

なので個人的には、簡単なJavaScriptやSQLを書ける非エンジニアがもっと世の中に増えてほしいと思っています。実際のプログラムを見ると「こんなの書けない」と感じるかもしれません。しかし1行1行を細かく見ていけば、そんなに難しいことはやっていないことがわかります。たとえば英語を仕事で使えるようになるための時間と比べたら、10〜100分の1くらいの学習時間で簡単な自動化はできるようになる感覚があります。

少し探してみると、たとえばfreeeさんがノンプログラマー向けのプログラミング学習講座を支援していたりもするようです。

こうした動きは応援したいですし、僕としても非エンジニアにプログラミングを教えるような活動は継続的にやっていきたいなあと思うところです。

「人間がやるべきじゃない仕事はコンピュータにやってもらう」という意識が、広く色んな職種の人にとって当たり前になる世界を目指して。

ここから先は

0字
同僚と飲むビール1杯分の金額で、飲み会で愚痴るよりもきっと仕事が楽しくなる。そんなコラムを月に3〜4本お届けする予定です。

【初月無料】デジタル時代の歩き方について考えたことを発信します。ソフトウェアの時代とは何か。エンジニアの頭の中はどうなっているのか。NoC…

サポートをいただけると、喜びドリブンで発信量が増えます!初月無料のマガジン『仕事を楽しくするデジタルリテラシー読本』もおすすめです!