Pythonのサンプルは既に挙げていますが、GAS版も。。やっぱりこちらのほうがコードもスッキリします。
2023-10-24
2023-10-01
GAS:GoogleシートのデータからGoogleフォーム(選択肢問題)を生成する
講義で選択肢問題を準備する機会が増えてきたので作ってみました。GASです。Googleシートに
- 問題文
- 正解選択肢文字
- 得点
- 選択肢‥
というならびでシートに作成しておき、下記のGASを動かせば作成できます。注意点は、このサンプルでは、正解選択肢の設定に、正解選択肢文字列との比較を用いていることです。補足すると、このケースでは、選択肢として「アイウエ」という選択肢ラベルのみを用意しています。(アイウエが何を表しているのは問題別紙に書いているということです)
ですので、もし選択肢を単なるアイウエではなく、文字列にしたいなら、2列目は世界選択肢文字ではなく、正解選択肢が何番目なのかを記述して、コードも修正したほうがいいです。(機会があれば、そのバージョンも用意します)
2021-08-22
GASで正規表現を使ったReplaceに変数を用いる方法
初歩的ですがメモ書き。
GAS(Google App Script)で正規表現を使ってReplace関数を使うときは、第一引数に直接正規表現を記述することができます。例えば、replaceを複数の対象に実行したい場合
result = result.replace(/abc/g, "ABC"); |
こんな感じにすればOK。。。しかし、abcのところに変数を使い場合にはどうすればいいか?正解は、RegExpクラスを使いましょう。。ということになります。
var target = "abc"; |
2021-08-16
GAS: You do not have permission to call DriveApp.Folder.createFile. Required permissions:
Google App Scriptの中で、Google Driveを操作するコードを書いたとき、表題のように
- GAS: You do not have permission to call DriveApp.Folder.createFile. Required permissions:
というエラーが出るときがあります。どうやら、カスタム関数の中では使用できない?という仕様のようで、場所を変更したら普通に動きました。もしかすると別の回避方法があるかもしれませんが、うまくいかない場合は記述場所を変えてみるといいでしょう。
2020-06-04
GAS:Google Document内でマウス選択した箇所を取ってくる方法
タイトルの通り、Google Document内でマウス選択した箇所を取ってくる方法のメモ書きです。
- selection.getRangeElementsではマウス選択した領域を含むElementがかえってきます。Elementの単位はドキュメント内部で勝手に決まってる感じですが、改行などが入ると別のElementとして扱われるようです。
- 上記をそのまま出力すると、そのElementの全ての文字が返ってくるので、getStartOffset()とgetEndOffsetInclusive()でマウス選択した範囲の始点終点をとってきています。
2020-05-03
GAS: GoogleSheet上の画像にスクリプトを動的に割り当てる
GoogleSheet上でアプリを作成する時、画像にスクリプトを割り当ててボタン代わりにするのはよくあるTIPSです。しかし最近、
- 画像に割り当てたはずのスクリプト設定が消える
という問題が頻発するようになり(一時的なバグかも知れませんが)、どうしたものかと考えた結果が今回の記事内容です。表題のとおり画像へのスクリプト割当は、GAS上で動的に設定できるようです。(画像の配置もGASでできるようです)
注意点:画像は挿入したものにする
Sheet上にボタン代わりの画像を置く時、【図形描画】アプリを使って画像を作成するのがラクですが、この方法だとSheet上の画像を認識することができないためダメです。つまり、
- ボタンとなる画像をファイルとして作成しておく
- Sheetに画像挿入のよりその画像ファイルを置く
となります。この手順を踏むことで、画像がGoogle Driveに格納されてidを持ち、GASで扱えるようになるのでしょう。なお、複数の画像を配置した場合、どのオブジェクトがどの画像かの特定する必要があるので、代替テキストの情報を利用するといいでしょう。
下記のサンプルは、画像にtestというメソッドを割り当てています。
下記のサンプルは、画像にtestというメソッドを割り当てています。
2019-11-08
GAS:コピペした英文をグーグル翻訳にかける前の前処理(改行処理)
英語論文などを読むときには、なんだかんだとグーグル翻訳に頼る機会が少なくないかと思います。ただ、PDFのテキストをコピペすると、変な位置に改行が入っていたりして翻訳がおかしくなることがしばしばです。そこで、Google翻訳にかける前の改行処理を自動化するGASのスクリプトを書きました。
JavaScriptですから、いろいろ転用できるかと思います。なお、正規表現を使ってます。
JavaScriptですから、いろいろ転用できるかと思います。なお、正規表現を使ってます。
2019-10-18
GoogleSheetのセルを線形探索する
GoogleSheet内のある列を対象に線形探索するケースが対象です。この時によく言われるTIPは、
- Sheetにアクセスする回数をできるだけ減らすこと
です。つまり、列のデータを全部とってきて配列に格納し、配列に対して線形探索をするというのが速度向上にも繋がります。で、これをfor文とかでループする。。っていうコードをついつい書いてしまう年頃なんですが、配列に実装されているメソッドを使ってシンプルなコードがかけるじゃんというのが、今日のネタです。
下記はそのサンプルですが、ちょっと1箇所だけ、getValues()とJavaScriptのobjectの使い方がよくわからなかったので、ちょっと細工をしてますがそこは適当に解釈してください(要は、文字列配列にしたかっただけです)。
2017-03-31
GAS: スプレッドシートに画像を埋め込む場合のノウハウ
Google App Script(GAS)にて画像を埋め込む際のノウハウです。GASには、SpreadSheetの画像埋め込みAPIとして、
を式としてセルに代入することで同等の事ができます。削除はセルの書き換えか、クリアで行えます。注意点は、
- sheet.insertImage(URL)
があります。これ自体は有効に機能するのですが、実はこのメソッドで埋め込まれた画像を削除する関数がありません。これはちょっと問題、、というときには、もっとスマートなやり方があります。それは、スプレッドシートの関数である
- image(URL,[モード])関数
- 画像サイズはセルサイズと同じ
2016-08-24
GoogleDriveに保存した画像を直接URL参照する
GoogleDriveは、アプリケーションからもクラウドなファイルストレージとして利用できる側面があります。例えば、アプリケーションで画像ファイルを一時(または永続的に)保存する領域としてです。S3みたいな使い方ですね。
しかし、画像ファイルをURLアクセスで読み込むときには注意が必要です。例えば、GAS(Google App Scriptで)、ドライブに保存した画像ファイルのURLを getURLで取ってきた場合に
画像ファイルだけを入手する場合には、
しかし、画像ファイルをURLアクセスで読み込むときには注意が必要です。例えば、GAS(Google App Scriptで)、ドライブに保存した画像ファイルのURLを getURLで取ってきた場合に
https://drive.google.com/file/d/XXXXXXXXXXXXXXXXというのが入手できますが、このURLは真の画像のURLではありません。Google Appsとして表示するビュワーを含んでいます。
画像ファイルだけを入手する場合には、
http://drive.google.com/uc?export=view&id=XXXXXXXとします。 上記XXXXXXはファイルのユニークIDです。
2016-03-10
Google App ScriptでGistAPIから得られるJSONからファイル名だけを取ってくる
GistのデータをとってくるプログラムをGAS(Google Apps Script)で取ってこようとしてます。GistのREST API使うとJSONフォーマットで結果が帰ってきますが、ファイル名を取ってくるときにファイル名がKeyになってるから、どうやってその名前を取ってくればいいのか?という問題にぶち当たります。で、その解決策は下記の通り。実は、この問題、昔、Javaで学生にやらせていて苦労していたようですが、GASだと意外とあっさり?というか、考え方が間違っていたかな?
2014-04-25
GAS: HTML出力時のハイパーリンクの埋め込み方
しょうもないネタですけど、ちょっとハマったのでメモ書き。
GASを動的なHTML出力をする時には、doGetメソッド内でcreateHTMLを利用すればいいのですが、ハイパーリンクを利用するときには注意が必要です。createHTMMLの中にアンカータグを入れてもダメです。無視されます。ハイパーリンク(アンカータグ)を追加したいときは、createAnchorを使います。
GASを動的なHTML出力をする時には、doGetメソッド内でcreateHTMLを利用すればいいのですが、ハイパーリンクを利用するときには注意が必要です。createHTMMLの中にアンカータグを入れてもダメです。無視されます。ハイパーリンク(アンカータグ)を追加したいときは、createAnchorを使います。
2014-04-20
GoogleサイトでのApp スクリプト呼び込み時にUserPrefを設定する方法
久しぶりのGAS(Google App Script)ネタです。
Google サイトでもGASは利用可能
ほとんどの人が知っていると思いますが、GASはGoogleサイトに埋め込みが可能です。Googleサイトは、JavaScriptの利用に関していろいろ制約がありますが、GASを利用することでちょっとした動的なページ生成が自然にできるという利点があります。その埋め込み方ですが、Googleサイトではデフォルトで埋め込みができるようにウィザードが用意されています。
Google Gadget用のXMLスクリプトを書かなくてもいいというのは便利ですね。
UserPrefの設定ができない
しかし、その便利さが欠点を生み出しています。それは、UserPrefを独自設定できないということ。XMLを書かなくてもいいということはカスタマイズできないというわけです。UserPrefを利用できれば、Gadgetの埋め込み時に初期パラメーターを任意に設定できるようになるので、URLパラメーターとしてGASに渡すことで、汎用的な使い方ができるという利点があります。そこで標準のウィザードに頼らず、GoogleGadgetのXML記述を自分で用意してiFrameの形式で呼び出せば、、と試みたんですが、どうもうまくいなかい。私のミスの可能性もありますが、少なくともiframeではなぜかGASを呼び出せないという結論になりました。
解決策:自作GadgetからスクリプトGadgetを呼ぶ
とりあえず試行して成功したのは、自作のGadgetXMLファイル内でiframeを介してスクリプトGadgetを呼ぶという荒業です。手順を以下に示します。
1.標準のApp スクリプトGadgetを利用して、対象のスクリプトを呼びページに埋め込む
まずは、対象のAppスクリプトを標準のウィザードで呼び出しページに埋め込みましょう。
2.ページをHTMLモードで表示し、App スクリプトGadgetのURLを見つける
Gadgetの中でdata-origsrcというのがGadgetURLの設定パラメーターのようですので、そのURLをメモします。
3. 自作のGadgetXMLファイル内でuserprefとiframeタグを記述する。
iframeタグで先ほどメモしたApp スクリプトGadgetのURLを指定します。UserprefのパラメーターをURLパラメーターに渡すことはもちろん可能です。
これで、GAS+Googleサイトを利用したちょっとした面白いアプリができそうです。
Google サイトでもGASは利用可能
ほとんどの人が知っていると思いますが、GASはGoogleサイトに埋め込みが可能です。Googleサイトは、JavaScriptの利用に関していろいろ制約がありますが、GASを利用することでちょっとした動的なページ生成が自然にできるという利点があります。その埋め込み方ですが、Googleサイトではデフォルトで埋め込みができるようにウィザードが用意されています。
Google Gadget用のXMLスクリプトを書かなくてもいいというのは便利ですね。
UserPrefの設定ができない
しかし、その便利さが欠点を生み出しています。それは、UserPrefを独自設定できないということ。XMLを書かなくてもいいということはカスタマイズできないというわけです。UserPrefを利用できれば、Gadgetの埋め込み時に初期パラメーターを任意に設定できるようになるので、URLパラメーターとしてGASに渡すことで、汎用的な使い方ができるという利点があります。そこで標準のウィザードに頼らず、GoogleGadgetのXML記述を自分で用意してiFrameの形式で呼び出せば、、と試みたんですが、どうもうまくいなかい。私のミスの可能性もありますが、少なくともiframeではなぜかGASを呼び出せないという結論になりました。
解決策:自作GadgetからスクリプトGadgetを呼ぶ
とりあえず試行して成功したのは、自作のGadgetXMLファイル内でiframeを介してスクリプトGadgetを呼ぶという荒業です。手順を以下に示します。
1.標準のApp スクリプトGadgetを利用して、対象のスクリプトを呼びページに埋め込む
まずは、対象のAppスクリプトを標準のウィザードで呼び出しページに埋め込みましょう。
2.ページをHTMLモードで表示し、App スクリプトGadgetのURLを見つける
Gadgetの中でdata-origsrcというのがGadgetURLの設定パラメーターのようですので、そのURLをメモします。
3. 自作のGadgetXMLファイル内でuserprefとiframeタグを記述する。
iframeタグで先ほどメモしたApp スクリプトGadgetのURLを指定します。UserprefのパラメーターをURLパラメーターに渡すことはもちろん可能です。
これで、GAS+Googleサイトを利用したちょっとした面白いアプリができそうです。
2013-07-06
Google Apps Script勉強会に参加&発表してきました
先日、GDG京都と京都GASとの共催のGoogle Apps Script勉強会(GAS勉強会)に参加してきました。私はGDG京都の運営スタッフ兼発表者として参加しました。
GAS概要(私)
ここは私が担当しました。。。が、このBLOGでも書いているとおり、GASについては最近はじめたばかりで、何か特別なことを話せるというネタはなかったのですが、自分自身の勉強のきっかけも兼ねて、GASの概要を調べて説明しました。正直、資料を作る時間が思ったよりもとれず自分でも未確認のところが多かったので、見当違いのことを話してるんじゃないかと柄になくめちゃめちゃ緊張しました。あと、個人的に時間オーバーする傾向があるので、ちょっと早めに喋ってたら思った以上に早く終わってしまい、ちょっとプレゼン的には失敗したかなという反省。ただ、ポイントは抑えたつもりで、後の発表の前知識としてはまずますだったかなと思います。あえて言えば、もう少しソースコードを見せてもよかったですね。
Google Apps ScriptとクラウドBPMとの連携(日下さん@クエステトラ)
自社のクラウドサービスにGASを連携させている事例の発表でした。GASによって既存のシステムを補完するというスタンスで、大変興味深い内容だったと思います。
Google Apps Scriptの業務での活用事例(佐藤さん@らしく)
SpreadSheetをサーバ的に利用する事例について報告されてました。また、GASをプログラミング教育のツールとしてとらえて活動をはじめていくようです。
Google Apps Scriptの新機能(小川さん@トップゲート)
最後は、本勉強会のメインディシュでもあるGoogle Expertの小川さんに今年のGoogleIOで紹介されたGASの新機能についてお話がありました。ライブコーディングで新機能を説明されるのは圧巻です(個人的にネット経由で小川さんのライブコーディングを背景したことはありますが、生で見るのは初めてです)。個人的に一番気になったのはGASによるFormsプログラミングですね。
自分ならびに他の3名の話を聞いて共通して感じたことは、GASは
- とてもお手軽
- しかもいろいろなことができてしまう
という点ですね。特に私は、佐藤さんも話していたのですがプログラミング教育の言語としての可能性をビリビリと感じました。商品などでの実利用は確かにまだリスクはありますが、ゼミでの卒研等でも使えそうですし、教育の場で利用してもいいかなと思ってます。
GAS関連のイベントがあれば、積極的に参加するつもりです。
2013-06-16
Goolge Apps Script勉強会
2013年7月5日(金)に、京都リサーチパークにて、KyotoGASとGDG京都主催のGoogle Apps Script勉強会を開催します。
私は、GDG京都スタッフとしてGoogle Apps Script(GAS) 概要について最初に話しますが、他にもGASをビジネスで利用されている方の事例紹介や、Google Developer Expertの方のHangout等の予定されています。
GASについては、本BLOGでも最近取り上げていますが、教育システムへの利用も含め、いろいろなポテンシャルを秘めていると思っています。
興味のある方は下記を御覧ください。
KyotoGASさんとGDG京都のGoolge Apps Script共催勉強会
2013-05-17
GAS:GASでSpreadSheetの組み込み関数(Query関数)を使う
GASは、私の勘違いでなければ
- SpreadSheetでGASで書いた独自の関数を呼び出すことができる
- SpreadSheetの組み込み関数をGASのスクリプトで呼び出すことができない(シート内だけで呼び出せる)
という仕様になっているようです(ちょっと信じられないんですが。勘違いかもしれません)。つまりシートの検索で使ってみたいQuery関数などは直接呼び出せないということになっているようです。で、その回避方法を思いついたので、、、
まずQuery関数はArrayで結果を返してくれるんですが、これをシート内で呼び出した場合、結果が複数あるとシートに複数行にわけて出力されます。これが大きなお世話な機能なんですが、この結果を1つのセルにおさめることができたらよくて、ここで独自の関数を組み合わせれば解決します。例えば、下記のようにArrayをCSVに変換する関数を用意します。
このQuery関数の結果をこの関数に渡すようにシートの式の記述をすればOKなわけです。例えば下記のようにします。
上記では、setFormulaを利用して一時的にあるセルにToCSVとqueryを組みあせた式を登録してます。(検索クエリの書き方が変なのは許してください。)こうすることで、シートの見た目が変わることなくquery関数を利用できます。
この方法を利用すれば、GASで直接SpreadSheetをデータベース的に使うことができます。まあ、GASにはDB機能もありますので、こういう使い方は今更かもしれませんが、、、、お試しあれ。
GAS: GASでウェブサービスAPIを実装する
GASは、GASでGoogle Driveがウェブサービスサーバになる? の記事でも書きましたが、ちょっとしたウェブサービスを実装することができます。ウェブサービスの場合は、普通のHTMLのレスポンスを返すのではなく、JSONやXMLといった形式で出力することになりますが、その記述をしておかないといけません。その方法ですがJSONの場合は
というように、出力のMimeTypeを設定しておく必要があります。XMLの場合はMimeType.XMLです。このタイプには、
というように、出力のMimeTypeを設定しておく必要があります。XMLの場合はMimeType.XMLです。このタイプには、
- ATOM
- JSON
- CSV
- ICAL
- RSS
- VCARD
- XML
といったフォーマットを指定することができるので、いろいろなタイプのウェブサービスが実装できると思います。
2013-05-11
GASとGWTの面白い関係
GASで記述するコードは、基本的にはサーバーサイドで動かすことを前提にしています。しかし、GASには「UiApp」と呼ばれるクラスがあり、これを利用することでHTMLのUIを作成することができます。
このUiAppを利用して作成されたHTMLページ(画面)は、実はGWTの形式で出力されていることが、ページのソースを見ることでわかります。つまり、
という、ある意味よくわからないことを内部処理でやっていることになります。
もちろんこれは、UI回りの変換だけです。AJax的な記述はGASの範疇ではないです。GASで作成できるウェブアプリは、基本的にHTTPリクエストによるページ遷移をベースにした従来型のウェブアプリケーションですので。
ただ、もしかすると将来的にAJax的な処理をかけるようになるのではないかなぁという気がしてます。
このUiAppを利用して作成されたHTMLページ(画面)は、実はGWTの形式で出力されていることが、ページのソースを見ることでわかります。つまり、
- GAS(JavaScript)→GWT変換→ JavaScript
という、ある意味よくわからないことを内部処理でやっていることになります。
もちろんこれは、UI回りの変換だけです。AJax的な記述はGASの範疇ではないです。GASで作成できるウェブアプリは、基本的にHTTPリクエストによるページ遷移をベースにした従来型のウェブアプリケーションですので。
ただ、もしかすると将来的にAJax的な処理をかけるようになるのではないかなぁという気がしてます。
2013-05-08
GWT(クライアント)+GAS(サーバ)というソリューション
先日からGASが気になってしょうがないので、その使いドコロについて考えているのだが、表題のように
個人的には、JavaScriptが嫌いでGWTにハマっているわけで、正直、GASには若干抵抗があります。しかし、ちょっと触ってみて思うのが、JavaScriptって意外とクライアントサイドよりサーバサイドにあっているのかな、、ということ。Node.jsが流行っているのもその点かもしれません。
- GWT(クライアント)+GAS(サーバ)
というのは魅力的なソリューションとしてOKかもしれない。その利点は下記の通り。
クライアント>サーバというニーズ
昨今のAJaxとかGAEの実装などの流れをみると、サーバではあんまりガリガリやらなくてクライアントで処理をやるというのがトレンド。とすれば、GWTでリッチクライアントを実装してGASのフロントエンドとするのは不自然ではないでしょう。
GWTとGAS間の処理はJSONPで
GWTはJavaScriptと性能は同じなので、クロスドメイン通信禁止の制約は当然もってます。しかし、JavaScriptと同様、JSONPによるクロスドメイン通信は可能なわけです。試しにGASでJSONを吐き出す簡易サーバを作成して、GWTのJsonpRequestBuilderを利用してアクセスすると無事、成功しました。
GoogleDrive(SpreadSheet)の操作が容易に
GASを利用する際に一番良く使いそうなのは、SpreadSheet。SpreadSheetをデータベース的に使うのはあまり現実的ではないですが、ログ環境的なデータの保存場所として利用するのはアリ!システム利用履歴とか記録など、あとから分析したいデータなどは、別にデータベースに入れておかなくてもSpreadSheetに直接入れておくほうが、閲覧もラクですしね。
ローコスト
GASの料金は基本的に無料。意外とGASでできることは豊富で、GAEよりも制約は低い感じ。GWTもサーバサイド処理を使わなければ、静的コンテンツとして場所はどこでもOK。DropBoxでもGoogle Driveでも置いておけばいいのです。
個人的には、JavaScriptが嫌いでGWTにハマっているわけで、正直、GASには若干抵抗があります。しかし、ちょっと触ってみて思うのが、JavaScriptって意外とクライアントサイドよりサーバサイドにあっているのかな、、ということ。Node.jsが流行っているのもその点かもしれません。
2013-04-28
JavaScript:Mapを実装する
(個人的にはJavaScriptは嫌いなのだが、GASで使う必要が出てきたのでメモ書き)
JavaScriptには、Mapというクラスはないが、配列の引数に任意の文字列を渡すことで、Map的なものとして使えるらしい。以下、サンプル。
ちなみに上記は、単語が格納されている配列を読み取って、頻度をMap(wordsMap)で管理するというプログラムです。
JavaScriptには、Mapというクラスはないが、配列の引数に任意の文字列を渡すことで、Map的なものとして使えるらしい。以下、サンプル。
ちなみに上記は、単語が格納されている配列を読み取って、頻度をMap(wordsMap)で管理するというプログラムです。
登録:
投稿 (Atom)


