新しいGoogle翻訳とスプレッドシートを使って国際会議への執筆をスマートにするついでに英作文力を高速に身につけるハック

CG,VR業界の研究者はこの時期、Laval VirtualやSIGGRAPHといった国際投稿のピークにあります。

白井研究室は規模の割には国際投稿が多いです。

blog.shirai.la/publications/

また数だけでなく内容も学部生でACMの学生研究コンテストで世界3位を受賞したりと、大学の入試難度の割には世界トップクラスの評価を受けることもあったりします(ちなみにACM SRCは書き物だけでなくファイナルはプレゼン審査込みです)。

本人の頑張りや先生の頑張り、研究の難度やインパクトはあるにせよ、一般的には日本語の論文を「ただ翻訳」したからといって別のアーティクルになったとみなすことはできません。しかし卒業論文や日本VR学会、インタラクションといった、日本語だったら構造的もクオリティ的にもしっかり書けるし、新規性もディスカッションもしっかりしている、さらにそのadvancementも加えられるような投稿もあるけれど、いざその学生に『英語投稿しようぜ!』と提案すると、もうその瞬間にグッチャグチャになる…といった経験はよくあります。

そもそも先生方も英語科学論文執筆のスキルや経験が十分にある方であれば指導もできるかとは思いますが、書き方のトレンドも分野によってはずいぶん違いますし、普段「日本語どっぷり業務」で押しつぶされている大学教員様が英語論文を査読等で読むのに精一杯なのに、ただ書くだけならともかく、「日本語の勢いを保ったまま翻訳する」というスキルを維持するのはなかなか難しいです。

そもそも日本語だって研究の先進性を求められるのに!英語まで書かねばならんのか!
これはハンデだ!俺は英語圏に生まれればよかった!うわーん!!
と嘆くのは簡単ですが、私はそうは思いません。
日本語に加えて英語もフランス語も、中国語も少しはわかりますが、英語単一文化圏に生まれていたら、それ以外の言語に目を向ける機会もなかったでしょうし、日本語が高度だからこそ、詩や短歌、冗談やマンガ・アニメやTwitterのような楽しいことも沢山あります。

また論文を書くことによって高度な日本語を身につける機会にもなります。いい勉強です。

さて、Google翻訳です。これは英語学習には不向きな面もあります。Google翻訳を英作文の一部にでも使おうものなら「どう見ても機械翻訳」という作文になり、あらゆる先生方から否定されたものです。しかし最近のアップデートにより「より自然な翻訳結果」が取得できるようになりました。

 

ではGoogle翻訳を科学論文の執筆に使えるか?というと、Noです。

少なくともそのままでは使える品質にはありません。理由はいくつかあります。

  • 「自然な翻訳」のために、多少の誤りは適当に正してくれる(誤りを発見できない)
  • 日本語と英語では論法が逆(日本語は大事なことを最後に書く)
  • 日本語は構造的に書こうとすると自然な日本語にならない
  • ときどき物凄い勘違いをする
  • 原文の日本語がそもそも曖昧。特に係り受けが本人に聞かないと不明だったりする。
  • 日本語と英語の多義性を考慮する必要がある(例:Play=遊び?試合?演奏?…)
  • ただしものすごく速い、しかも無料。

以下の解説は、上記のようなGoogle翻訳の特性を利用して、英語投稿のワークフローと新しい英作文力向上のための勉強法を提案しています。特に先生方と若い学生さんがWeb上で深夜日中を問わずコラボして執筆するような環境を想定しています。細部に関してはノウハウもあるので割愛しちゃいますが、最大に重要な関数はこれです。

=GOOGLETRANSLATE(B1,”ja”,”en”)

これをGoogleスプレッドシートに入れてみてください。賢い先生であればこれだけで十分と思います。

つまりこの関数を使うことで、Google翻訳のエンジンをGoogle Spreadsheetから使うことができます*

関数リファレンス

構文 GOOGLETRANSLATE(テキスト, [ソース言語, ターゲット言語])

使い方としてのポイントはこの先です。ワークフローにしてまとめます。

<準備>

  1. まず以下のヘッダを1行目に用意し「表示→固定→1行」、A1〜F1に以下。

    Question, Answer(人間による英作文), Google英語, 質問の自動翻訳, 人間による日本語, 人間による英作文の邦訳, MEMO

  2. オンライン投稿によくあるWebフォームの質問をスプレッドシートのA列に分解して貼り付ける
  3. D列[D2]にA列を日本語訳する式を設定 [=GOOGLETRANSLATE(A2,“en”,“ja”)]
  4. E列にD列の日本語質問に該当する「とりあえずの日本語」を書く。和文論文から貼り付ける。いま書けない場合は「条件付き書式」を設定して空白セルに色付けしておくと良い。
    ここでは例として「触覚フィードバックを用いたショートニング不使用クッキーによるハードクッキーのテクスチャー解析」という仮の和文論文からのコピペを貼り付けておきます。
    *あえて係り受けが不明瞭なタイトルです。
  5. C列[C2]にE列を英訳するセルを設定する[=GOOGLETRANSLATE(E2,”ja”,”en”)]
  6. さらにF列[F2]にB列を日本語訳するセルを設定する [=GOOGLETRANSLATE(B2,“en”,“ja”)]
  7. G列はメモ、必要に応じて文字数カウントとか実装するといいです。文字数カウントはLEN()で作れますが、ワードカウントしたい人はGASで作るといいかもです(shirayuca@qiitaによる実装例)。

スクリーンショットにするとこのようになります。

<使い方>

手順通りに作ってくれた人は、もう使えると思います、あえてテンプレとしてダウンロードさせないのは「自分で作った方が理解できるしカスタマイズもできる」からです。列が右に左にするのは「その方が対訳として見やすい」からです。以下手順になります。

  1. D列の自動翻訳の日本語質問を読みながら、E列にまず日本語を書いていきます。
  2. するとC列に勝手に英語が生成されます。
  3. B列に「C列の英語を見ながら人間の英作文」を書きます。少なくとも単語で困ることはなく、書き出しもスラスラ書けます。ただしC列の英語が一発でOKになることはまずないです、疑ってかかるか、楽をしたければE列の日本語を改善していきましょう。
  4. 英作文が正しいかどうか、F列を見ながらすすめます。E列とF列がほぼ同じ意味になればよいわけです。
  5. あれ?もう完成していますね!しかも1作文ごとに英作文力がアップしていくことを感じられます。

上記の例では「not use」というGoogle翻訳の提案を無視して「without」としています。そもそも日本語のタイトルが冗長であることに気が付いたりもします。主文が「触覚フィードバックを用いた」なのか「ショートニングを使わない」なのか、Googleさんにはわかりません。MEMO欄に「おい主著者、どっちが主文だかはっきりしろ!」と書いておくと良いでしょう。右クリックで「メモ」や「コメント」を使うと校閲しやすく、Web上で高速に共著作業が進んでいきます。

さて本文の執筆です

上記は国際投稿の際のEasyChairやSIGGRAPH SISにおけるWebフォームの例ですが、本文も同様です。白井研究室の場合、和文の場合はCloudLaTeX,、英語論文はShareLaTexを使用していますので、CloudLaTeXからの英語→日本語の変換工程で構造的に執筆された日本語を英語に翻訳していく過程が必要になりますから、上記のシートをコピーしてカスタマイズして、A列の質問を主著者や先生のストラテジに置き換えていけば良いのです。

Google翻訳の特性上、あまり長い作文をしようと思わない方がいいです。一方で、コンテキスト(前後関係)も重要ですので、だいたい目安としては一段落程度で区切ったり、代名詞Itなどを補完しながら中間的な(=Googleさんにわかりやすい)言語で書いてあげると良いと思います。その言語を日本語で行える、右クリックすればメモなども使える、という点が上記のワークフローの特徴です。必要であればどんどん行を増やしていくと良いです。

最後にB列をガシッとコピーして、Word等のトラディショナルな英語チェック環境やエキサイト翻訳のようなクラシックな翻訳エンジンに通してみることをお勧めします。図版を入れる作業なども必要ですからこのワークシートだけで全てを終わらせるわけにはいきませんが、この段階で人間の有料英語レビューに依頼できるレベルまでは達しているはずです。Todo管理なども含めると分業もしやすくずいぶんとストレスの少ない英語執筆が可能になると思います。

 

ブログに書いた方がいいだろうなというレベルはこの辺りまでですね!

白井研究室のノウハウとしては、上記の方法だけで論文を書いている訳ではありません。これに加えてGAS(Google Apps Script)なども組みあわせていったりもします。ビデオの字幕やYouTube字幕などもこれでずいぶん改善されます。そもそもワークフローにこだわるというよりは自力で、動的に、改善していくことが重要と思います。

なおGoogle翻訳はGoogle Cloud API経由でも使える訳ですが、課金やセットアップが必要な情報に比べてもずいぶんスマートなのでした。
unokun.hatenablog.jp/entry/2015/08/08/103841

白井としては、これでAndroidタブレットやスマホでも書ける!というのは大きいです(右腕が使えませんので、机で両腕を使って書ける時間が限られているのですイタタ…)。

フィードバックありましたら @o_ob までどうぞ!

*(追記:2017/2/17 22:00)

本稿のGoogle Spreadsheet関数で利用できるGoogle翻訳では、フレーズ間の翻訳確率を計算して翻訳先の言語の適切な語順に並べ替える、フレーズベース機械翻訳(PBMT)を採用しているようです。2016年11月にアップデートされたニューラルネットワークベースのGoogle Neural Machine Translation(GNMT)はPBMTよりも翻訳精度が上がる印象がありますが、本稿の関数にはまだ実装されていないようです。
ご参考:グーグルの翻訳AIが「独自の言語」を生み出したといえる根拠(2016.11.24)
wired.jp/2016/11/24/google-ai-language-create/

(例1)
原文:Percent of overcrowded households among bottom quintile of income distribution.

Spreadsheet関数版Google翻訳(エンジン不明):所得分配の底五分位間の過密世帯の割合。
Web版Google翻訳(GNMT日英)所得分配の下位5分の1の間で混雑した世帯の割合。

ちなみにWeb版のほうもクリックすると翻訳候補として「底五分位間の」が出てきますのでやはり「新しい」とはいえGNMTはまだSpreadsheetには使われてないと見てよいでしょう。いつ反映されるのでしょうかね!楽しみです。ただしある日突然変わるので注意が必要です。原文や作文はちゃんと保持してくださいね。

(例2)2017/2/18 23:00追記
原文: Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds

GNMT日本語訳: 技術革新の話はうそつきです。シャットダウンして作業を完了させる – Linus Torvalds

GoogleTranslate関数: ハイテク技術革新の話はでたらめです。黙って仕事を成し遂げる – Linus Torvalds氏は述べています

この文であればGoogleTranslate関数の方が素直な訳でいいですね、GNMTによる日本語訳は英語に直すと「The story of technological innovation is a liar. Shut down and complete the work」、うそつきとシャットダウンが強く残ってしまっています。
なおこの一文は実際のニュースとしてはもっと恣意的な翻訳をされているのでまだマシなのかもしれませんが…。

しかしGoogle翻訳(GNMT)の翻訳結果がお上品になるのは良いことなんだろうか?「ブルシッt」が「うそつきです」になる事で人類のヘイトを抑えられるどころかより齟齬を産んでるんじゃねーの、って気持ちもある。
この辺り、もう現実はチェス囲碁将棋AIと翻訳に関してはSFに両足突っ込んでる感じがしますね。シンギュラリティです。

ところでSpreadsheetにはこれ以外にも面白い関数がいっぱいあります。

ImportFeed, ImportXML, IMAGE, それに最新の株価・為替が取得できるGoogleFinance関数も便利です。

Excelで苦手なヒストグラムも一発で出せますよ!

どんどん使ってみてくださいね。

 

ご紹介の際は一言頂ければ幸いです

国際論文連発の研究室が明かす、英作文超ノウハウ。Google翻訳ってスプレッドシートから使えるんだ!|ギズモード・ジャパン t.co/VbFhLG4LFz

書籍「Google Apps Script クイックリファレンス」は大変心強い!

「Google Apps Script クイックリファレンス」(横山隆司・秀和システム刊)という書籍が2013年2月に発刊されているようなので入手しました。

国内初の本格的なGASのリファレンスブックです。いわゆる「逆引きGoogle Apps Script」とでもいうべき書籍ですね。

www.shuwasystem.co.jp/products/7980html/3675.html

ものすごくボリュームがあります。507ページ!

特に興味深いのは、以下の項目ですね…。Googleの公式APIドキュメントには記載がありますが、学生さんに読んでもらって分かりそうな「具体的なサンプル」は滅多に存在しませんので…。

  • 5-4 開始時間と終了時間を指定してイベントを追加するには
  • 6-14 ダッシュボードを作成するには
  • 6-17 文字列フィルタを作成するには
  • 7-12 連絡先から取得/設定できる値は
  • 8-1 テキストコンテンツを出力するには
  • 10-8 ドキュメントの末尾にリストのアイテムを追加するには
  • 10-9 ドキュメントの末尾に表を追加するには
  • 12-34 Gmailのメールから取得できる値は
  • 14-2 HTML文字列を出力するには
  • 15-1 文字列を翻訳するには
  • 17-2 1日に送信できるメールのクォータを取得するには
  • 18-21 座標から住所の情報を取得するには
  • 21-3 ScriptDbにデータを保存するには
  • 22-8 サイトにファイルキャビネットページを追加するには
  • 24-49 セルを結合するには
  • 25-9 UiInstanceを使って生成できるウィジェットは
  • 25-14 DatePickerを利用するには
  • 25-15 DateBoxを利用するには
  • 26-1 外部サイトのURLにアクセスするには
  • 26-2 OAuth設定を取得するには
  • 26-3 OAuth設定に設定する値は
  • 26-4 HTTPResponseから取得できる値は
  • 27-1 書式文字列を指定して日付を文字列に変換するには
  • 27-2 JSON文字列をオブジェクトに変換するには
  • 27-3 オブジェクトをJSON文字列に変換するには
  • 27-4 Blobオブジェクトを作成するには
  • 28-1 XML文字列を解析するには
  • 29-2 キャッシュにデータを保存するには
  • 29-3 キャッシュに保存されているデータを取り出すには
  • 30-1 Google Cloud SQLを利用するには
  • 31-2 Google Apps ScriptでBigQueryを利用するには

Google Apps Scriptクイックリファレンス

以下、公式から引用した目次です。

Chapter 1 Google Apps Scriptの概要
1-1 Google Appsとは
1-2 Google Apps Scriptとは
1-3 Google Apps Scriptでできることは
1-4 Google SpreadSheetでスクリプトを作成するには
1-5 Google Siteでスクリプトを作成するには
1-6 Google Apps Script単体プロジェクトを作成するには
Chapter 2 スクリプトエディタ
2-1 スクリプトを作成するには
2-2 スクリプトを実行するには
2-3 スクリプトの実行ログを表示するには
2-4 スクリプトをデバッグ実行するには
2-5 ブレークポイントを設定するには
2-6 作成したスクリプトをデバッグするには
2-7 スクリプトエディタで補完機能を利用するには
2-8 スクリプトエディタでプロジェクトのプロパティを編集するには
2-9 スクリプトの変更履歴を表示するには
2-10 開発したプロジェクトのスナップショットを取るには
2-11 作成したプロジェクトのプログラムをライブラリとして利用するには
2-12 ライブラリプロジェクトにコメントを反映させるには
2-13 ライブラリプロジェクトのドキュメントを見るには
Chapter 3 トリガー
3-1 トリガーとは
3-2 特定の日時にトリガーを起動するには
3-3 定期的に実行するトリガーを登録するには
3-4 スプレッドシートを開いた時に実行するトリガーを設定するには
3-5 スプレッドシートの保存時に実行するトリガーを設定するには
3-6 スプレッドシートのフォームから登録された時に実行するトリガーを設定するには
Chapter 4 Baseサービス
4-1 実行ログを出力するには
4-2 実行ログをクリアするには
4-3 現在の実行ログを取得するには
4-4 ダイアログボックスを表示するには
4-5 入力ボックスを表示するには
4-6 ログインしているユーザを取得するには
4-7 スクリプトを実行しているユーザを取得するには
4-8 スクリプトのタイムゾーンを取得するには
4-9 ユーザのメールアドレスを取得するには
4-10 ユーザのログインIDを取得するには
Chapter 5 Calendar
5-1 任意の日に終日のイベントを登録するには
5-2 任意の日に終日の拡張オプション付きイベントを追加するには
5-3 定期的な終日のイベントを追加するには
5-4 開始時間と終了時間を指定してイベントを追加するには
5-5 タイトル文字列からのquick-add機能を利用するには
5-6 開始時間と終了時間を指定した定期的なイベントを追加するには
5-7 カレンダーを作成するには
5-8 Google Calendarに設定したすべてのカレンダーを取得するには
5-9 Google Calendarに設定したすべてのマイカレンダーを取得するには
5-10 カレンダーの名前を指定してGoogle Calendarに設定したカレンダーを取得するには
5-11 IDを指定してGoogle Calendarに設定したカレンダーを取得するには
5-12 カレンダーの名前を指定してGoogle Calendarに設定したマイカレンダーのカレンダーを取得するには
5-13 カレンダーのIDを指定してGoogle Calendarに設定したマイカレンダーのカレンダーを取得するには
5-14 プライマリカレンダーを取得するには
5-15 繰り返しイベントのルールを作るには
5-16 Google Calendarに登録されているカレンダーの予定を取得するには
5-17 カレンダーに設定している色を取得するには
5-18 カレンダーの説明を取得するには
5-19 カレンダーを削除するには
5-20 終日のイベントを取得するには
5-21 IDを指定して、定期的なイベントを取得するには
5-22 カレンダーのIDを取得するには
5-23 カレンダーの名前を取得するには
5-24 カレンダーのタイムゾーンを取得するには
5-25 カレンダー設定の「リストに表示」にチェックがあるかどうかを確認するには
5-26 カレンダーがプライマリカレンダーかどうかを確認するには
5-27 カレンダーの所有者が現在のアカウントかどうかを確認するには
5-28 カレンダーの表示状態を確認するには
5-29 カレンダーの色を設定するには
5-30 カレンダーの詳細説明を設定するには
5-31 カレンダーの「リストに表示」設定を変更するには
5-32 カレンダーの名前を設定するには
5-33 カレンダーの表示状態を設定するには
5-34 カレンダーのタイムゾーンを設定するには
5-35 定期的なイベントで1日毎の繰り返し設定を作成するには
5-36 定期的なイベントで指定した回数分登録されるのを除外するには
5-37 定期的なイベントの終了日を指定するには
5-38 定期的なイベントで特定の日付には登録されないようにするには
5-39 定期的なイベントで1ヶ月毎の繰り返し設定を作成するには
5-40 定期的なイベントで1ヶ月毎の繰り返し設定を指定した回数分除外するには
5-41 定期的なイベントで1週間毎の繰り返し設定を作成するには
5-42 定期的なイベントで1週間毎の繰り返し設定を指定した回数分除外するには
5-43 定期的なイベントで1年毎の繰り返し設定を作成するには
5-44 定期的なイベントで1年毎の繰り返し設定を指定した回数分除外するには
5-45 イベントの詳細情報を取得、設定するには
5-46 定期的なイベントの詳細情報を取得、設定するには
5-47 イベントを削除するには
Chapter 6 Charts
6-1 データテーブルを作成するには
6-2 面グラフを作成するには
6-3 棒グラフを作成するには
6-4 横向きの棒グラフを作成するには
6-5 折れ線グラフを作成するには
6-6 円グラフを作成するには
6-7 散布図を作成するには
6-8 表を作成するには
6-9 グラフの表示を変更するには
6-10 グラフの表示サイズを変更するには
6-11 折れ線グラフをなめらかな曲線で表示するには
6-12 円グラフを3D表示にするには
6-13 テキストのスタイルを生成するには
6-14 ダッシュボードを作成するには
6-15 数値の範囲フィルタを作成するには
6-16 カテゴリフィルタを作成するには
6-17 文字列フィルタを作成するには
6-18 グラフのカラムを表示するかどうかを制御するには
Chapter 7 Contacts
7-1 連絡先を作成するには
7-2 連絡先グループを作成するには
7-3 連絡先を取得するには
7-4 連絡先を削除するには
7-5 すべての連絡先を取得するには
7-6 連絡先にメールアドレスを追加するには
7-7 連絡先に電話番号を追加するには
7-8 連絡先にインスタントメッセンジャーのアカウントを追加するには
7-9 連絡先にURLを追加するには
7-10 連絡先に勤務先を追加するには
7-11 連絡先に誕生日を追加するには
7-12 連絡先から取得/設定できる値は
Chapter 8 Content
8-1 テキストコンテンツを出力するには
8-2 テキストコンテンツに文字列を追加するには
8-3 テキストコンテンツに追加した文字列をクリアするには
8-4 テキストコンテンツをファイルとしてダウンロードさせるには
8-5 テキストコンテンツに文字列を設定するには
8-6 テキストコンテンツのMimeTypeを設定するには
8-7 TextOutputから取得できる値は
8-8 設定できるMimeTypeは
Chapter 9 DocsList
9-1 ファイルを作成するには
9-2 フォルダを作成するには
9-3 ファイルを取得するには
9-4 フォルダを取得するには
9-5 ファイルを検索するには
9-6 ファイルの共同編集者を追加するには
9-7 ファイルの閲覧者を追加するには
9-8 ファイルの共同編集者を削除するには
9-9 ファイルの閲覧者を削除するには
9-10 ファイルのコピーを作成するには
9-11 ファイル名を変更するには
9-12 ファイルの詳細情報を取得するには
9-13 ファイルに文字列を追加するには
9-14 ファイルに追加した文字列をクリアするには
9-15 ファイルの中身を置き換えるには
Chapter 10 Document
10-1 ドキュメントを作成するには
10-2 IDを指定してドキュメントを取得するには
10-3 アクティブなドキュメントを取得するには
10-4 ドキュメントにフッターを追加するには
10-5 ドキュメントにヘッダーを追加するには
10-6 ドキュメントの末尾に区切り線を追加するには
10-7 ドキュメントの末尾に段落を追加するには
10-8 ドキュメントの末尾にリストのアイテムを追加するには
10-9 ドキュメントの末尾に表を追加するには
10-10 ドキュメントの末尾に改ページを追加するには
10-11 ドキュメントの末尾に画像を追加するには
10-12 ドキュメントに区切り線を挿入するには
10-13 ドキュメントに段落を挿入するには
10-14 ドキュメントにリストのアイテムを挿入するには
10-15 ドキュメントに表を挿入するには
10-16 ドキュメントに改ページを挿入するには
10-17 ドキュメントに画像を挿入するには
10-18 ドキュメントの編集内容を保存するには
10-19 ドキュメントのテキストオブジェクトを取得するには
10-20 ドキュメントの本文を置換するには
10-21 ドキュメントの各種情報を取得、設定するには
10-22 ヘッダーを細かく編集するには
10-23 フッターを細かく編集するには
10-24 段落を細かく編集するには
10-25 画像を細かく編集するには
10-26 テキストを細かく編集するには
Chapter 11 Finance
11-1 株価の履歴を取得するには
11-2 株価情報の詳細を取得するには
11-3 取引データの詳細を取得するには
Chapter 12 Gmail
12-1 ラベルを作成するには
12-2 ラベル名を指定してラベルを取得するには
12-3 全てのラベルを取得するには
12-4 ラベルを削除するには
12-5 チャットの履歴を取得するには
12-6 Gmailの受信トレイのメールを取得するには
12-7 Gmailの受信トレイにある重要なメールを取得するには
12-8 Gmailのスター付きメールを取得するには
12-9 Gmailの迷惑メールを取得するには
12-10 Gmailのゴミ箱にあるメールを取得するには
12-11 Gmailのメールのスレッドを取得するには
12-12 GmailのメールIDからメールを取得するには
12-13 Gmailのメールを既読にするには
12-14 Gmailのメールを未読にするには
12-15 Gmailのスレッドを既読にするには
12-16 Gmailのスレッドを未読にするには
12-17 Gmailのスレッドを重要なスレッドにするには
12-18 Gmailのスレッドを普通のスレッドにするには
12-19 Gmailのメールをゴミ箱に移動するには
12-20 Gmailのスレッドをアーカイブ化するには
12-21 GmailのスレッドをSpamに設定するには
12-22 Gmailのスレッドを受信トレイに移動するには
12-23 Gmailのメールをリフレッシュするには
12-24 Gmailメールを検索するには
12-25 Gmailのメールをスター付きにするには
12-26 Gmailのスター付きメールのスターを外すには
12-27 Gmailのメールの件数を取得するには
12-28 Gmailのラベルにスレッドを追加するには
12-29 Gmailのラベル内のスレッドを取得するには
12-30 Gmailのラベルからスレッドを削除するには
12-31 Gmailのラベルから取得できる値は
12-32 Gmailのスレッドのメールに返信するには
12-33 Gmailのスレッドから取得できる値は
12-34 Gmailのメールから取得できる値は
12-35 Gmailのメールを転送するには
Chapter 13 Group
13-1 ログインしているユーザが所属しているGoogle Groupを取得するには
13-2 Google Groupのメールアドレスからグループを取得するには
13-3 Google Groupから取得できる値は
Chapter 14 HTML
14-1 htmlファイルを作成するには
14-2 HTML文字列を出力するには
14-3 HTML出力にコンテンツを追加するには
14-4 HtmlOutputでタイトルを設定するには
14-5 HtmlOutputのコンテンツをクリアするには
14-6 HtmlOutputで取得、設定できる値は
14-7 HTMLテンプレートを作成するには
14-8 HTMLテンプレートからHTML出力を生成するには
14-9 HTMLテンプレートから出力されるJavaScriptコードを取得するには
14-10 HTMLテンプレートに設定したコンテンツをそのまま取得するには
Chapter 15 Language
15-1 文字列を翻訳するには
Chapter 16 Lock
16-1 ユーザのみ有効なでプライベートロックを取得するには
16-2 すべてのユーザで有効なパブリックロックを取得するには
16-3 ロックを取得するには
16-4 ロックを解放するには
16-5 ロックを取得しているかどうかを確認するには
Chapter 17 Mail
17-1 メールを送信するには
17-2 1日に送信できるメールのクォータを取得するには
Chapter 18 Maps
18-1 静的なマップオブジェクトを取得するには
18-2 特定の住所のマップオブジェクトを取得するには
18-3 特定の住所にマーカーをセットするには
18-4 地図の中に直線を引くには
18-5 地図に表示する直線の定義を開始するには
18-6 直線の頂点を追加するには
18-7 地図に表示する直線の定義を終了するには
18-8 設定したマーカーをクリアするには
18-9 設定した直線をクリアするには
18-10 地図の中心を設定するには
18-11 表示されるマーカーにカスタムスタイルを適用するには
18-12 地図の画像フォーマットを設定するには
18-13 地図の言語を設定するには
18-14 地図の種類を変更するには
18-15 地図に表示されるマーカーを変更するには
18-16 モバイル向けの地図を出力するには
18-17 直線のスタイルを設定するには
18-18 地図のサイズを設定するには
18-19 地図を拡大縮小するには
18-20 住所からGeocodeを取得するには
18-21 座標から住所の情報を取得するには
18-22 Geocodeの言語を指定するには
18-23 Geocodeのリージョンを指定するには
18-24 2点間のルートを計算するには
18-25 指定した場所の高度データを取得するには
Chapter 19 Properties
19-1 スクリプトのプロパティにキーをセットするには
19-2 スクリプトのプロパティに複数のキーを一括でプロパティを設定するには
19-3 スクリプトのプロパティを取得するには
19-4 スクリプトのプロパティを一括で取得するには
19-5 スクリプトのプロパティのキーの一覧を取得するには
19-6 スクリプトのプロパティを削除するには
19-7 スクリプトのプロパティを全て削除するには
19-8 ユーザプロパティにキーをセットするには
19-9 ユーザプロパティに複数のキーを一括でセットするには
19-10 ユーザプロパティを取得するには
19-11 ユーザプロパティを一括で取得するには
19-12 ユーザプロパティのキーの一覧を取得するには
19-13 ユーザプロパティを削除するには
19-14 ユーザプロパティを全て削除するには
Chapter 20 Script
20-1 トリガーオブジェクトを生成するには
20-2 登録されているトリガーの一覧を取得するには
20-3 登録されているトリガーを削除するには
20-4 登録されているサービスを取得するには
20-5 承認を解除するには
20-6 SpreadSheet用トリガー作成オブジェクトを生成するには
20-7 時間主導型トリガー作成オブジェクトを生成するには
20-8 時間主導型トリガーに毎日起動することを指定するには
20-9 時間主導型トリガーに毎時間起動することを指定するには
20-10 時間主導型トリガーに毎分起動することを指定するには
20-11 時間主導型トリガーに毎週起動することを指定するには
20-12 時間主導型トリガーに毎月何日に起動することを指定するには
20-13 時間主導型トリガーに「何時に実行するか」を指定するには
20-14 時間主導型トリガーに特定の日時を指定するには
20-15 時間主導型トリガーに細かい起動時間(分)を指定するには
20-16 時間主導型トリガーにタイムゾーンを指定するには
20-17 時間主導型トリガーを登録するには
Chapter 21 ScriptDb
21-1 ScriptDbとは
21-2 ScriptDbにアクセスするためのインスタンスを取得するには
21-3 ScriptDbにデータを保存するには
21-4 ScriptDbに複数のデータを一気に保存するには
21-5 ScriptDbからデータを取得するには
21-6 特定の検索条件を指定して、ScriptDbからデータを取得するには
21-7 ScriptDbに保存したデータを削除するには
21-8 ScriptDbに保存したデータを一括で削除するには
21-9 ScriptDbに保存したデータのIDを指定して削除するには
21-10 ScriptDbに保存したデータのIDを指定して一括で削除するには
21-11 特定の検索条件を指定して、ScriptDbに保存されているデータ件数を取得するには
21-12 一括更新時に全ての処理が成功したかどうかを確認するには
21-13 ScriptDbからデータを取得するクエリの条件指定の仕方は
21-14 ScriptDbから取得したデータをソートするには
21-15 クエリの取得結果の件数の上限を指定するには
21-16 クエリの取得結果の開始位置を指定するには
21-17 クエリの取得結果をページ指定で取得するには
21-18 クエリの取得結果の件数を取得するには
21-19 クエリの取得結果から、データを1件取得するには
21-20 クエリの取得結果で、次のデータがあるかどうかを確認するには
21-21 キーの読み出しやクエリで取得したデータをJSON形式の文字列で出力するには
21-22 キーの読み出しやクエリで取得したデータのIDを取得するには
21-23 キーの読み出しやクエリで取得したデータのプロパティを参照するには
Chapter 22 Sites
22-1 Google Siteにサイトを作成するには
22-2 サイトを取得するには
22-3 URLを指定してサイトを取得するには
22-4 作成したサイトを一括で取得するには
22-5 アクティブなSiteを取得するには
22-6 アクティブなPageを取得するには
22-7 サイトにアナウンス用ページを追加するには
22-8 サイトにファイルキャビネットページを追加するには
22-9 サイトにリストページを追加するには
22-10 サイトにWebページを追加するには
22-11 サイトの共同編集者を追加するには
22-12 サイトのオーナーを追加するには
22-13 サイトの閲覧者を追加するには
22-14 サイトの共同編集者を削除するには
22-15 サイトのオーナーを削除するには
22-16 サイトの閲覧者を削除するには
22-17 サイトのページを検索するには
22-18 サイトから取得できる情報は
22-19 リストページのリストに列を追加するには
22-20 ページにコメントを追加するには
22-21 ページに添付ファイルを追加するには
22-22 リストページのリストに行を追加するには
22-23 ファイルキャビネットページのリストにリンクを追加するには
22-24 アナウンスページにアナウンスを追加するには
22-25 テンプレートページを作成するには
22-26 テンプレートからページを作成するには
22-27 ページを削除するには
22-28 ページから取得できる情報は
22-29 コメントを削除するには
22-30 コメントから取得できる値は
22-31 リストページの行から取得できる値は
22-32 リストページの列から取得できる値は
22-33 添付ファイルを削除するには
22-34 ページの添付ファイルから取得できる値は
22-35 ページの種類と添付ファイルの種類は
Chapter 23 SOAP
23-1 WSDLファイルを取得するには
23-2 WSDLのサービス名を取得するには
23-3 WSDLServiceから取得できる値は
Chapter 24 Spreadsheet
24-1 アクティブなスプレッドシートを取得するには
24-2 アクティブなシートを取得するには
24-3 アクティブなRangeを取得するには
24-4 スプレッドシートを開くには
24-5 スプレッドシートを作成するには
24-6 スプレッドシートに対する変更を適用するには
24-7 スプレッドシートに共同編集者を追加するには
24-8 スプレッドシートに閲覧者を追加するには
24-9 スプレッドシートにカスタムメニューを追加するには
24-10 スプレッドシートに追加したカスタムメニューを削除するには
24-11 アクティブなシートに行のデータを追加するには
24-12 アクティブなシートを削除するには
24-13 アクティブなシートをコピーするには
24-14 シートを追加するには
24-15 アクティブなシートを移動させるには
24-16 スプレッドシートの共同編集者を削除するには
24-17 スプレッドシートの閲覧者を削除するには
24-18 スプレッドシートにカスタムUIのダイアログを表示させるには
24-19 スプレッドシートに通知ウインドウを表示させるには
24-20 シートの最下行にデータを追加するには
24-21 シートの値、書式を全てクリアするには
24-22 シートのコメントを削除するには
24-23 シートの全てのセルの値を削除するには
24-24 シートの全てのセルの書式を削除するには
24-25 シートを他のスプレッドシートにコピーするには
24-26 シートの列を削除するには
24-27 シートの行を削除するには
24-28 シートの行を隠すには
24-29 シートの列を隠すには
24-30 シートにグラフを追加するには
24-31 シートのグラフを削除するには
24-32 シートに行を挿入するには
24-33 シートに列を挿入するには
24-34 シートに画像を追加するには
24-35 非表示にした列を表示させるには
24-36 非表示にした行を表示させるには
24-37 セルの値を並び替えるには
24-38 Spreadsheetから取得できる値は
24-39 Sheetから取得できる値は
24-40 範囲を選択するには
24-41 結合したセルを分割するには
24-42 特定範囲の値、書式を全てクリアするには
24-43 特定範囲のコメントを削除するには
24-44 特定範囲のセルの値を削除するには
24-45 特定範囲のセルの書式を削除するには
24-46 特定範囲のセルの書式をコピーするには
24-47 特定範囲のセルの値をコピーするには
24-48 特定範囲のセル(値、書式全て)をコピーするには
24-49 セルを結合するには
24-50 セルの値を移動するには
24-51 指定範囲をオフセットを指定して変更するには
24-52 Range内のセルの値をソートするには
24-53 Rangeから取得できる値は
24-54 シートの保護を行うには
24-55 シートの保護中に編集可能なユーザを追加するには
24-56 シートの保護中に編集可能なユーザを削除するには
24-57 シートの保護中に編集可能なユーザを取得するには
24-58 シートが保護されているかどうかを取得するには
24-59 グラフを作成するときに範囲を指定するには
24-60 グラフで指定した範囲を削除するには
24-61 グラフのオプションを設定するには
24-62 グラフの種類を指定するには
24-63 グラフの表示位置を指定するには
24-64 グラフオブジェクトを作成するには
24-65 作成したグラフオブジェクトを編集するには
24-66 作成したグラフから取得できる値は
24-67 グラフの詳細情報から取得できる値は
Chapter 25 Ui
25-1 Google Apps ScriptでUIを利用するには
25-2 UIを構成するためのインスタンスを生成するには
25-3 生成したUiInstanceを取得するには
25-4 UIを画面に追加するには
25-5 ウィジェットにタイトルを設定するには
25-6 UiInstanceに設定できる値は
25-7 GUI Builderで作成したUIをロードするには
25-8 ウィジェットのIDを指定してオブジェクトを取得するには
25-9 UiInstanceを使って生成できるウィジェットは
25-10 アンカーを利用するには
25-11 ボタンを利用するには
25-12 キャプション付きパネルを利用するには
25-13 チェックボックスを利用するには
25-14 DatePickerを利用するには
25-15 DateBoxを利用するには
25-16 サーバ側で動作するイベントハンドラを利用するには
25-17 クライアント側で動作するイベントハンドラを生成するには
25-18 メニューを利用するには
25-19 タブを利用するには
25-20 SubmitButtonを利用するには
Chapter 26 UrlFetch
26-1 外部サイトのURLにアクセスするには
26-2 OAuth設定を取得するには
26-3 OAuth設定に設定する値は
26-4 HTTPResponseから取得できる値は
Chapter 27 Utilities
27-1 書式文字列を指定して日付を文字列に変換するには
27-2 JSON文字列をオブジェクトに変換するには
27-3 オブジェクトをJSON文字列に変換するには
27-4 Blobオブジェクトを作成するには
27-5 スクリプトの実行中にSleepさせるには
Chapter 28 Xml
28-1 XML文字列を解析するには
28-2 XML要素を生成するには
28-3 XML属性を生成するには
28-4 XmlAttributeから取得できる値は
28-5 XmlElementからXML文字列を出力するには
28-6 XmlElementから取得できる値は
28-7 XmlDocumentからXML文字列を出力するには
28-8 XmlDocumentの最上位の要素を取得するには
28-9 XmlNameから取得できる値は
Chapter 29 Cache
29-1 キャッシュを取得するには
29-2 キャッシュにデータを保存するには
29-3 キャッシュに保存されているデータを取り出すには
29-4 キャッシュに保存されているデータを削除するには
Chapter 30 JDBC
30-1 Google Cloud SQLを利用するには
30-2 データベースに接続するには
30-3 接続をクローズするには
30-4 AutoCommitを制御するには
30-5 Statementを生成するには
30-6 PreparedStatementを生成するには
30-7 select文を実行するには
30-8 PreparedStatementのプレースホルダーに値を設定するには
30-9 select文の結果を1行取得するには
30-10 select文の結果の列の値を取得するには
30-11 更新系SQL文を実行するには
30-12 行数を返さないSQL文を実行するには
30-13 実行するSQL文をバッチ登録するには
30-14 登録された複数のSQL文をバッチ実行させるには
30-15 データベースへの変更をコミットするには
30-16 データベースへの変更をロールバックするには
30-17 Statementをクローズするには
30-18 プレースホルダーに設定するための特殊なオブジェクトを生成するには
Chapter 31 BigQuery
31-1 BigQueryとは
31-2 Google Apps ScriptでBigQueryを利用するには
31-3 BigQueryのクエリの書き方は
31-4 BigQueryで実行するクエリで使える関数は
31-5 BigQueryでクエリを実行するには
31-6 BigQueryで実行しているクエリの終了を確認するには
31-7 BigQueryのテーブルのデータを取得するには
31-8 テーブルやクエリの実行結果から行データを取得するには
31-9 取得した行データから列のデータを取得するには
31-10 BigQueryに行を追加するには
A Appendix
A-1 Google Apps Scriptに関する参考資料について
A-2 外部JavaScriptライブラリをGoogle Apps Scriptに取り込む

おわりに

欲を言えば25章のUIで、ファイルアップロードについても解説していただければよかったかな、と。

でも使える情報が多くて助かります。突破力のあるコードを書かねばならないときに、見通しが出る書籍があるのは大変心強いです。
■Google Apps Scriptクイックリファレンス

Google SpreadsheetとEXCELを連携させる意外な方法

Google Spreadsheetはとても便利なクラウドオフィス環境ですが、最大の弱点があります。

それは「印刷に弱い」ということです。

印刷をしなくていい業務であればよいのですが、業務アプリの開発は「最後は紙」であることも多いのです。

私がこれまでGoogle Apps Scriptで開発してきた業務アプリにおいて,そこそこ凝った帳票はGoogle Docsワードプロセッサの文字置き換え→PDF出力→メール添付→あらかじめ印刷しておいた帳票に手差し印刷、という方法をとって来ましたが、フォントは化けますし、どうしてもEXCELで普及している罫線たっぷりのフォームを全面置き換えするところまでたどり着きませんでした。

今回はあきらめて,Google Docsで管理してきたデータを最終工程でEXCELにデータを取り込まなければならない環境,という前提で話を進めます。

もちろんGoogle Spreadsheet側のデータの更新の必要がなければ、ダウンロードして使えばいいことです。しかしレポート出力後もデータの更新がある場合、何度もEXCEL形式でダウンロードして,リンクを貼り直して…というやり方では何かかっこ悪いし、事故が起きそうです。

ここでは、完全にエンドユーザにも任せられて、プログラミングは全く使用せず、それでいてセキュリティ的にも感じのよい方法を紹介します。

『えっそんな方法あるの?しかも無料で…?』という感覚をお持ちになるかもしれませんが、私もそうでした。

Google DocsのデータとOfficeを連携させるOffiSync社はJiveに買収されてしまいましたし,大塚商会のデータースパイダーはODBC経由でよくできていそうですが,有料です.

www.offisync.com/index.html

www.otsuka-shokai.co.jp/products/dwh/bi-tool/dataspider/adapter/

MySQLやZendPHP経由でいいのであれば、他にもやり方はあるのですが、そこまでコストを払いたくない!という人向けの方法です。

以下の手順を見ればわかりますが、EXCELやGoogle Docsのユーザであれば「使ったことがある機能の組み合わせ」で実現できてしまいます。

【Google Docs側でのエクスポート設定】

まず、GoogleDocs上のファイルから「ウェブに公開…」を選択します。そこで以下のようにエクスポートしたいテーブルを設定します。

WebPub

この公開用URLは元来、Google DocsのデータをHTMLとして表示したり、IFRAMEを使ってWebページに組み込んだりするのに使われていました。HTML形式以外ですとCSV,TSVとPDFが選択できますが、今回は動的更新のためにあえてHTML形式を使います。

【EXCEL側でのインポート設定】

さて、次はEXCELです。

リボンメニューの「データ」から「Webクエリ」を選んでください。

WebQuery

……もうおわかりですね!ここに先ほどのエクスポートURLを設定して、データが取れればラッキーです。やってみましょう。

WebQuery2

よく見ると、オプションと取り込むテーブルをここで設定できます。

黄色い→で明示的に指定し、オプションでは様々なチェックボックスがあります。いろいろ試してみたところ、テキストフィールドの改行壊れを防ぐためにもHTMLであることを明示するのが良いようです。

さらに次のステップで「新しいシート」を取り込み先で選ぶことができますが、その前に「プロパティ」を選択してください。

WebQuery3

名前,更新頻度,新しいデータに対する扱いなどを設定できます。これはすばらしい。

さて、取り込み完了です。あとはEXCEL上で好きに料理すれば良いと思います。フォーム上からVLOOKUPを使って必要なデータを取れば印刷専用のEXCELを作ることも容易いでしょう。

WebQuery4

このデータ領域は「全て更新」を選ぶことでいつでも更新できます。もちろんEXCEL→Docsへの更新はできませんが、元々フォーム印刷目的ですのでセキュリティ的にもこれでいい用途もあるのでは?

★VLOOKUPについて知りたい方はリクエストしてくださいね!
(書いてたら消えた)

これでGoogleDocsをコアにして、確定申告やら請求書やらの帳票関係もクラウド化して、年賀状印刷などの紙が絶対必要な顧客管理アプリも統合させる見通しができました。

クラウドに乗せられないEXCEL守秘データとの整合もとれるし、謎の外部サービスにGoogleのパスワードをいれさせたりしないし、HTTPSで接続しているし(URLで鍵が丸見えなのでOfficeの接続を検証しないとセキュアとはいいがたいですが)可能性のある方法です。

GoogleDocsがXMLエクスポートをサポートするともっと使いでがありそう!

GAS:入力された日付の曜日をスプレッドシート側で自動計算

Google Apps Scriptは便利なのですが、時にはプログラム上での計算処理ではなく、スプレッドシート側の関数で処理したいこともあると思います。

可視化性やメンテナンス性を高めるためにこういう柔軟性は必要だと思います。

よくある例としてはGoogleFormで日付を入力させた場合です。

入力者に出張開始日と出張終了日をYYYY/MM/DD形式で入力させることは難しくないでしょう、でも曜日や出張日数を自動計算できないシステムなんてちょっと機能的にも信頼されないと思います。

スプレッドシート側では以下の様な形で収納したいとしましょう。

sheet

フォームからはK列とM列にデータが入ります。L列,M列,O列はそれぞれ


L2=vlookup(weekday(K2),曜日,2,false)

M2=vlookup(weekday(M2),曜日,2,false)

O2=M2K2+1

といった式を入れておきたいわけです。

なおここでは「曜日」という範囲を別のシートに以下の様なデータで定義しています。EXCELと同じような名前定義が使えるのは便利ですね。

【「曜日」で定義されたデータ】

1 日
2 月
3 火
4 水
5 木
6 金
7 土

さて、スクリプトです。

入力されたデータを自動処理するあたりで文字列として「=vlookup(weekday(K2),曜日,2,false)」をセットしてみるのですが、どうもセルの参照である「K2」が正しく働いてくれません。
色々やってみた挙句、以下のように相対参照(いわゆるR1C1形式)で表記すれば自動的に正しいセルのアドレスを取得してくれるようです。これはこれで便利ですね!コードに落とした場合は以下のとおりです。

 //曜日と出張日数を自動計算
d = sh.getRange(row, 1, 1, rg.getLastColumn()).getValues(); //指定行のデータを取得
 if (d[0][11]=="") { //左から数えて12個め,つまりL列が空白だったら以下のコードを自動で入れます
rg.getCell(rowline, 11+1).setValue("=vlookup(weekday(R[0]C[-1]),曜日,2,false)");
rg.getCell(rowline, 11+3).setValue("=vlookup(weekday(R[0]C[-1]),曜日,2,false)");
rg.getCell(rowline, 11+4).setValue("=R[0]C[-2]-R[0]C[-4]+1");
 }

Google Apps Scriptはクラウド側で演算してくれるので、利用者が演算コストを意識する必要はないのですが、スクリプト側のタイムアウトを防ぐためにもスプレッドシート側で演算できるものはできるかぎりスプレッドシート側で処理させたほうが良いと思います。
スクリプト側にハードコーディングしてしまうと、スプレッドシート側でいろいろやりたいエンドユーザ(EXCELスキルがある人とか……)を突き放すことにもなります。

実際にはEXCELでいろいろやりたいユーザさんが味方になってくれてこそのGAS利用だと思いますので

このような設計手法は柔軟性があって良いと思います!