調べる事で抜け出す10億回ループ地獄

佐野

佐野 2012年12月20日

GoogleAppsScriptの依頼が来ました。
今回は、かなりの大作になりそうです。

その大まかな内容は、今までMicrosoft OfficeのExcelで行っていた事を、
GoogleAppsのスプレッドシートで行い、複数のシートと連動、
またPDFで内容を出力するといった様々な事を組み合わせた感じになっていきます。

しかし、自分も最初の頃は、ゲーム制作には憧れを抱いていたものの、
プログラミングの本を実際に読んでみると、ちんぷんかんぷんで断念してしまい、
職業訓練でHTMLについて学んでいた頃も、JavaScriptは理解できず、
また、それ以前はHTMLはスタイルシートの概念も知らずに、
タグに直接打ち込む事だけしかできないぐらいでした。

ですが、職業訓練第2コースで、Androidアプリ学習の一部として、
Javaを学んだ後は、プログラムの大まかな概念や動き方について
理解できるようになり、今ではプログラムがどう動くのかも、
だいたい予測できるようになってきました。

それでもまだ、困惑する事も多く、調べながらやっている次第です。
思うんですけど、完全に熟知してから失敗をしないようにするよりも、
そうやって調べながら出来るほうが、より上達するんじゃないかと。
まぁ、自分で言うのもなんですが・・・

タッチタイピングもプログラムを一発で書いていくのも、
慣れによるものだと思うのです。
私自身はタッチタイピングこそ出来ないものの、
関数をある程度資料を見ないで扱えるようになるなど、
プログラムにも慣れてきました。

GoogleAppsScriptに関しても、関数をネットで調べに調べ抜いて、
完成品のコードの中から、どの部分が必要なのかを解析する事もありました。
GoogleAppsScriptは、JavaScriptの拡張ですが、
これに関する情報は、日本でも一般的に浸透しているとは言いがたい状況です。
そんな中で必要なのは、その時点で新しい物に対応できるように、
調べる能力だと思います。

私も訓練第1コースを終えた後の就職支援にて、
Microsoft Officeの試験を受け、
資格を手にしなければ就職は困難だと言われた事もありましたが、
今となっては、Microsoft Officeは使わず、
Googleドライブや、LibreOfficeを使用しています。
そして、Excelの関数を使用する事も希で、
簡単な編集やGoogleAppsのスクリプトを書いていくほうが、めっぽう多いですね。

さて、今回の仕事に関しての話に戻りますが、
まず必要な機能のひとつとして、ソート機能を作ろうと思います。
スプレッドシート自体にも、ソート機能はあると思いますが、
ソートすべきデータの場所が不定な場合(たとえば、いちばん左上を基点としていない場合)、
そういう場合はタイトルなどを入れて
表のような見た目として成形されている場合も多く、
内容だけでなくタイトルなどもソートの対象となる場合もあるでしょう。
そうならないためにも、スクリプト上でソートシステムを作成しようと考えました。

ソートシステムを作るうえで必要なのは、
日付をUNIX時間(協定世界時基準で1970年1月1日からの秒数)で、
1か最大数から順に比較し、配列を組み替えようなどと考えていましたが、
調べてみると、JavaScriptにもソート用関数が存在していました。
いちばんわかりやすいのは、こちらかと思われます。
http://programp.com/blog/?p=70#.UNKXUaya8yk
各入力箇所や動作の解説があり、理解がしやすいです。
もちろん、GoogleAppsスクリプトでも使う事ができましたし、
シートからの範囲選択取得「getValues()」関数から取得する値は二次配列なので、
ちょうど二次配列の部分が、そのまま役に立ちます。

当初自分が考えていた方法は、10億回ループさせる方法でした。
つまり、UNIX時間のケタ数は9ケタで1億分。
1からUNIX時間を検索しようかと思っていました。
しかし実験してみた結果、ループするだけでも2分ほどの時間を要します。
なので、今度は 西暦→月→日→24時間分だけのUNIX時間
と、分割して照合しようと考えていました。
しかし、上記ソート関数を見つけたおかげで、その必要もなくなりました。
調べてみるもんですねぇ。

ソートは解決したものの、まだまだ作るべき課題が残っています。
最終的に、どのようなシステムになるのかは、
口頭でしか聞いていないため、まだ明確に掴めていませんが、
仕様書を作成していただくようにお願いしたので、
それまでは使うと思われるシステムを考え、
いつでも導入できるように、そして単体でも動くように作成しておきます。