電気羊の執務室

魔法を作る仕事をしています。

Google Document API の文書構造

こんにちは。 今回、Googleドキュメントの文書をスクリプトから編集する処理を書いていて、ハマったポイントがあるので共有します。

水平線(hの扱い

今回やろうとしたのは、文書を水平線(hr)で区切る構成です。 - 水平線以前がテンプレート - 水平線以降に出力結果が表示される

という構成で、水平線以前/以降を判定する処理が必要でした。

水平線を取得する

水平線を取得するのは、 BodyオブジェクトのfindObjectメソッドで行います。

var firstHr = body.findElement(searchTypeHR);

こんな感じです。 これで取得できるのはRangeElementオブジェクトなので、さらにgetElement()メソッドで、中身のHorizontalRuleオブジェクトを取り出してあげます。

var theHr = firstHr.getElement();

これを基準に、段落(Paragraphオブジェクト)の位置を判定すれば、水平線以前と以降がわかるはずです。

水平線の前後要素が取れない

しかし、ここがハマりポイントとなりました。 すなわち、HorizontalRuleオブジェクトの、文書内の位置が取れません。

ここで読むべきものはドキュメントです。

https://developers.google.com/apps-script/guides/docs#structure_of_a_document

これによると、『水平線は、ListItemやParagraphの配下である』と書いてあります。 文書構造としては、このようになっているわけです。

Body
  ├ Paragraph
  │  ├ Text
  │  └ Text
  ├ Paragraph
  │  └ HorizontalRule
    .
    .
    .

解決法

HorizontalRuleオブジェクトはParagraphオブジェクトの子なので、文書内の位置を知るには、親要素となるParagraphオブジェクトを取得する必要がありました。

というわけで、以下のようにすると、文書内の位置が取れたのでした。

body.getChildIndex( theHr.getParent())

めでたし。

GoogleAppsScriptで差し込み印刷

Google Apps Scriptで、ドキュメントの差し込みを行うサンプルを作りました。

完成品は別途シェアするとして、内容とハマったポイントを記録しておきます。

やりたいこと

Wordの差し込み印刷のような事が、Google Docsでやりたかったです。 具体的には、こういう感じです。

  1. Google Documentの文書(テンプレート文書と呼びます)に本文と置換用のプレースホルダを書いておきます。
  2. 別のスプレッドシート(実行シートと呼びます)に、差込用の言葉(相手の名前など)を書いておきます。
  3. スプレッドシートでスクリプトを実行します。
  4. プレースホルダが差込用の単語に置き換わって、テンプレート文書の後半に、新しい本文が生成されます。(テンプレートを置き換えてしまうと何度も使えないので)
  5. たくさん作れないと意味がないので、スプレッドシート上にたくさんの文書のURLと、それぞれの差し込み内容を書いておくと、一括で生成します。

この記事で作るもの

  1. テンプレート文書
  2. Google Drive上にドキュメント文書を作り、テンプレート文書とします。
  3. テンプレート文書には、本文とプレースホルダを記述します。
  4. テンプレート文書のドキュメントIDをコピーしておきます。
  5. 実行シート
  6. Google Drive上にスプレッドシートを作り、実行シートとします。

  7. スクリプトファイル

  8. 実行シートから作ります。
  9. テンプレートから本文を生成する部分です。

作成手順

1.テンプレート文書を作る 今回は、テンプレート文書の中に、テンプレート部分と出力結果を生成するスタイルにします。

テンプレート文書はひとつで、出力結果を分けたい場合は、別途スクリプトを調整してください。

文書の中では、テンプレート部分と出力結果を水平線で区切ります。最初の水平線以前がテンプレート部分、それ以降が出力結果となります。

テンプレート部分に、本文とプレースホルダを記述します。 今回のサンプルでは、{最初の差し込み内容}{ふたつ目の差し込み内容}という文字列を使っています。この波カッコ内がプレースホルダとなり、出力結果では差込文字列と置き換わります。

2.実行シートを作る

Google Drive内にスプレッドシートを作り、実行シートとします。 シートの内容は、以下のようにします。

  • 最初の行をタイトル行とし、以下の項目を定義します。
    • ドキュメントID
    • 差込用文字列
  • 2行目以下はデータ行です。
    • ドキュメントIDに、テンプレート文書のドキュメントIDを指定します。
    • 差込用文字列に、プレースホルダと置き換える文字列を指定します。

3.スクリプトファイルを作る

実行シート上で『ツール → スクリプトエディタ...』を選択し、スクリプトエディタを起動します。

スクリプトエディタのファイルを、任意の名前に変更します。

音楽と情熱

指揮者のTEDトーク

最近動画で見た、ある指揮者のプレンテーションがたいへん面白かったのでシェアします。 TEDという、アメリカの山の中で色んなプレゼンをする大会で話しているところです。

とりあえず見て下さい。

https://www.ted.com/talks/benjamin_zander_on_music_and_passion?language=ja#t-1227291

このトークが素晴らしいのは

1.誰でも音楽を楽しめる能力がある事を、会場の参加者に体験させる事。 『自分にはできる』という体験を強烈に印象付けるのは、とても貴重な事です。

2.ショパンの曲を通して、音楽の成り立ちをわかりやすく解説している事。

3.自分が取り組んでいる分野に、『誰も分かってくれない』と諦めてはいけないと教えてくれる事。

僕もプログラミング教えてますが・・・

もっと皆さんの目を輝かせられるように、僕も面白いコンテンツを作ろう・・・ そう決意を新たにしました。

今年は動画をたくさん配信するのが目標のひとつです。

Google Apps Scriptが便利

小さなアプリをGoogleAppsScriptで作る

GoogleAppsScript(GAS)を知っていますか? Googleのサーバー上に、小さなプログラムを乗せる事ができるのです。

これは地味にすごいことです。

Herokuを始め、プログラムを乗せる場所を使わせてくれるサービスは、他にもあります。

GoogleAppsScriptの何がいいか?

GASのいいところは、ある程度お手軽にサラッと書く事もでき、 Webアプリに拡張する事もできる事です。

また、自動実行で定期的な処理をさせる用途にも使えます。

イメージは太陽や風

太陽の光は、毎日定期的に降り注いで、植物を育てたり、熱を与えてくれたりします。 あるいは、常に吹いている風のようなものです。

その一部分を、自分がうまく行くように仕掛けをしてあげることで、得をすることができます。

プログラミングは、まず自分が得をしないといけません。

AIBOがニュースになってます

AIBOのニュース

AIBOのニュースが放送されています。
僕は、実家で母と一緒にニュースを見ましたが、
『可愛い、可愛い』と母は絶賛でした。

ロボットのいる未来

試作品や製品を見るまでは、『ロボットなんて気持ち悪い』と思うものですが、
一度見てしまうと、愛着がわくのもまた人間です。

うちにはルンバが一台いますが、非常に可愛いものです。
人間は、機械にすら愛着を見出す生き物なんだな、ということが、自分自身の感覚でよく分かります。

不気味の壁

不気味の壁って知ってますか?
ロボット工学をやる人の難関です。微妙に似ていないロボットを、非常に気持ち悪く感じる』という修正があるのです。

『不気味の壁』で検索すると、気持ち悪い写真が出てきます。 これらは、ロボットデザイナーが壁を超えられなかった、失敗の系譜です。

デザイナーは、完璧なデザインで人を魅了しないといけないのです。
中途半端は、逆効果なのです。

僕達も、どうせ作るなら、愛される未来を作りたいものですね。

プログラムを学ぶ=プログラマー?

Quoraの質問より。

現在、プログラミングを勉強しています。
しかし、プログラマーになりたいとは思っていません。
プログラミングの知識があるからプログラマーの選択しかないのでしょうか?

これについて、僕はこう答えました。

全業種でプログラムが必要

プログラミングできる人は、全業種で大切です。

日本は少子化で、労働人口が減ってゆくので、至る所でプログラミングをして効率化しないと、国力が衰退する一方です。 20年後には日本は隣国の一部になりかねません。

プログラムは、必ず実世界とセット

また、プログラムは、単体では存在し得ません。 レジを打つためのプログラム、在庫を管理するためのプログラム、文書を保管するためのプログラム。

プログラムは、全て『別の何かを実現するために』作られます。 なので、『プログラムの分かる〇〇業界人』というのは、非常に価値が高いのです。

異業種にこそプログラマーを!

それだけではありません。

同じレベルのスキルでも、IT業界とそれ以外では、価値が異なります

例えば、JavaScriptとSQLのスキルが少しある人がいるとします。 彼は、ソフトウェア会社のプログラマーなら見習いですが、例えば建設業界にいれば、魔法使いのように扱われるかも知れません。

しかも、ソフトウェア導入や開発を外注する時など、建設会社にシステムに詳しい人がいれば、業務ルールや業界慣習などについて、仕様の打ち合わせ精度が上がります。 その彼が、建設会社にとって、どれだけ貴重な存在か想像してください。

むしろIT業界以外にこそ、ITリテラシーが必要なのです。

神頼み

僕は、年が明けると、いくつかの神社に初詣に毎年行きます。

神前で、今年の抱負を語り、加護を求めます。

神は要るのか?

エンジニアには、信心が必要なのか? 神が本当に助けてくれるのか?という議論が、昔ありました。

その時の結論は、確かこうでした。

『あとは神頼み』というところまで、手を尽くす。
手を尽くした事を確認するために、最後に神頼みするんだ。

味わい深い言葉です。
たいてい、ちょっとテストの手を抜いたところから、見透かしたように不具合が噴出したりするものです。

パソコンに心はあるのか?

パソコンは、人を見て不具合を出したり、たまに機嫌を損ねたり、まるで意思があるようにふるまうものです。

パソコンには、心があるのか?
たまに、この話題が出ますね。

僕は、こう答えます。 『パソコンに心があると見なすと、うまく行く事が多い』
本当に心があるかは別として、経験則です。

人間に心はあるのか?

人間でも、生まれつき感情のない人が、
感情を持っている振りをすると、見破れないそうです。

我々が、本当に心を持っているのか、本当は誰も心など持っていないのか。

哲学的な問いは、僕の好むところです。

それではまた。

OSを作るといい

質問サイトQuoraより

プログラマーが少なくとも1回は作るべきプログラムは何ですか?という質問がありました。

僕は、こう答えました。

作るべき、という言葉の定義

*『作るべき』という言葉の定義を、ここでは『やらなければ失格の、必要条件』ではなく、『作った事があれば、どなた様でも理想的』という意味で解説します。

OSがおすすめ

ズバリ、OSです。 OSは、ロマンがあるので作るべきでしょう。

普段、我々が使っているパソコンは、電源を入れた時に、どこから最初のプログラムをロードするのか、それがどのようにして、日本語の文字を表示させるのか。 そのように、小さなプログラムが無限に発展してゆく様子を、感じ取る事ができます。

ふだん使うOSのありがたみ

Windowsなど、普段触るOSがどんな働きをしているのか、ふだんプログラムを作るうえで前提となっている部分のありがたみを知り、動作を理解することで、プログラマーとしてのスキルは大幅に向上するはずです。

ついでに、『ハードとしてのパソコンに、自分の書いたOSでイチから描画させる』というハード寄りの楽しみもあります。

OS作りを、強くお勧めします。

参考文献

30日でできる! OS自作入門

脳を味方にしましょう

脳を味方にしましょう

あなたの脳について、あなたはどれだけ知っていますか?

この記事では、脳科学のエッセンスを取り入れ、人生がうまく行くヒントを提供します。
自分の脳を上手にコントロールすれば、自然と爆発的な力を出す事ができます。

脳は食いしんぼう

もののサイトによると、脳は相当大食らいのようです。 https://www.kango-roo.com/sn/k/view/3725

脳が必要とする血液量は、脳組織100gに対して1分当たり50〜60mL、脳全体では1分当たり800mL前後です。1分当たりの心拍出量が約4.5Lですから、脳に流れ込んでいる血液量は心拍出量の1/5〜1/6にも達します。

この記事の最後で、脳を上手に使う方法を解説しますね。

プログラマーに必要な脳力は?

プログラマーは頭脳労働なので、いろいろな脳力が必要ですが、まず思いつくのは、『鮮明に想像する力』です。

これから作るシステムの動作や、それによって生まれる喜びを鮮明に描く。

作る最中に、動作のイメージや、部品同士が連携するイメージを持ち、うまく行きそう、うまく行かなそう・・・とシミュレーションしてみる。

これらの事を、脳内のメモリーを最大限に使って、鮮明にイメージするのです。

脳を鍛えるには?

あなたの脳に最高のパフォーマンスを出させるため、気をつけると脳にいい事は、たくさんあります
あるのですが、今日は1つだけシェアします。

比較的、反発の少なそうなものを・・・

『ながらスマホを止める』

これです。

ながらを止める

食事をしながら、または何かの合間に、スマホを見ていませんか? スマホに限らず、『ながら』をやると、脳は意味なく疲れます

『食べる』と『見る』の間に、脳の切り替えが頻繁に発生するので、それだけで脳が疲弊するのです。 しかも、『微妙に達成感がある』という、悪いおまけ付きです。

昔のしつけでは『行儀が悪いからやめなさい』と言われましたが、脳科学的にも、理に適っているのです。 礼儀作法というものは、先人たちが検証を済ませた、人間にとって得する行いの集合知なのですね。

GoogleSpreadsheetを使って、短縮URLを作る

やりたい事

複数のURLを一括で短縮したい。

要件

複数URLは、EXCELからコピペで入力完了できたほうがよい。

本日時点では、複数人同時実行は考えなくてよいが、 OS依存は許されない。

設計

EXCEL・・・はいったん断念

オーダー元が、mac環境なので、当初考えていた、
『EXCELでちゃちゃっと作る』が思ったより面倒そうでした。

WinHttpのライブラリが、macにはなく、
クエリテーブルを使っていかないと、
URL短縮用のhttpリクエストを投げられません。

ひとつURLを投げるたびに、短縮したURLを返す関数を組んで・・・ という流れをやるのに、クエリテーブル必須となると、
何かスムーズでないものを感じ、いったんやめました。

Google Cloud Platform・・も一旦やめた

GCPでWebサービスを作ろうかと思い、Pythonのプロジェクトを作りました。 Rubyでもいいのですが、バージョンに苦しんだ事もあり・・・

さて、Webでやるとなると、EXCELからの複数行貼り付けが難しいです。
複数行を取って複数行を返すところが面倒くさいです。

GoogleSpreadsheetにしました

Spreadsheetなら、ほぼそのまんまの記事がありました。

https://webapps.stackexchange.com/questions/76050/google-sheets-function-to-get-a-shortened-url-from-bit-ly-or-goo-gl-etc

これを改造して、左端の行すべてを短縮するように変えました。 また、クリアを付け、URLがない時にスキップする処理など、ガード系の処理を入れました。

ひとりツールとしては完成

EXCELからの転記も問題なくできるので、ひとまずSpreadsheetでたたき台完成としました。

画面イメージ

不特定多数の人に使ってもらうとなると、もうひと工夫、ふた工夫必要ですね。