ぴあぴあゆーとぴあ

雑記ブログ

GoogleAppsScriptのプログラム備忘録

前回に引き続いて、GASの話をしていこうと思います。

作成したwebアプリ
前回の記事で貼り忘れてしまいましたが、以下のような画面のwebアプリを作成しました。

f:id:nanabyo:20170827175621p:plain



Googleドライブでこのスプレッドシートを共有し、このwebアプリのURLを知っていれば誰でも作業録を投稿することができます。

f:id:nanabyo:20170827175641p:plain



投稿すると、上記の画面のシートに投稿した内容が、逐一スプレッドシートに反映されます。

プログラムの構成
前回書いたように、基本的にはHTMLとjavascriptでできています。
また整形のためにbootstrapなどのライブラリも使っています。

GASは、スプレッドシートの内容を読み取ったり、変更したりする際にのみjavascriptから呼び出しています。
HTMLやjavascriptの説明はドットインストールや数ある書籍などに任せるとして、
javascriptからGASを呼び出す方法を解説していこうと思います。
javascriptからGASを呼び出す

function findRow(sheet,val,col){
var dat = sheet.getDataRange().getValues(); //受け取ったシートのデータを二次元配列に取得
for(var i=1;i<dat.length;i++){
if(dat[i][col-1] === val){
return i+1;
}
}
return 0;
}
//前回の進捗率の定義を返す
function getPreProgress(task) {
// マスタデータシートを取得
var datasheet = SpreadsheetApp.openById('シートID').getSheetByName('シート名');
var row = findRow(datasheet, task, 3);

var preProgress = datasheet.getRange(row, 5);
Logger.log("selectList = %s", preProgress.getDisplayValue());

return preProgress.getDisplayValue();
}


上記のような関数をgsファイルに記述します。
引数であるtaskは文字列をイメージしてください。
findRow関数はシートからcol列目について、valと同じ値を持つ行が何行目かを返します。
またgetDefinitionOfProgress関数は3列目から引数taskを探し、taskと同じ行の5列目の値を返します。

function displayPreProgress(){
var task = document.getElementById("select_id2").value;
try {
google.script.run
.withSuccessHandler(function(result) {
document.getElementById("output_id2").value = result;
})
.withFailureHandler(function(result) {
toastr.error('前回の進捗の取得に失敗しました。', result);
})
.getPreProgress(task);
} catch (e) {
toastr.error(e);
}
}


上記のような関数をjavascriptファイルに記述します。

google.script.runというクラス(?)を用いることによりgsファイルの関数を呼び出します。
「.withSuccessHandler(function(result) {})」の中に処理が成功した場合の処理を書きます。
「 .withFailureHandler(function(result) {})」の中に処理が失敗した場合の処理を書きます。
最後の「.getPreProgress(task)」がgsファイルに定義した実行したい関数名を書きます。
上記の記述例ではresultにgetPreProgress関数の返り値が格納されます。
またプログラムの内容は、select_id2の値を取得し、
gsファイルからselect_id2の値に対応する「進捗率のセル」の値を取得し、
その値をoutput_id2に出力するというものになっています。


おまけ
http://genbassnohito-maroro0208.hatenablog.com/entry/2017/05/16/235105
http://qiita.com/tadaken3/items/5f916a12587e42ece814
LineNotifyとGASを組み合わせることで、Lineに通知を飛ばすことができます。
Googleカレンダーの内容をLineに送ることもできるようです。

また、定期的に自動でプログラムを走らせることもできます。
例えば毎日午前10時にプログラムを走らせることができます。

webアプリを作る際に、自分でサーバーを用意する手間が省けて、
大変便利ですね。

感想
javascriptは必要になった時に適当に触るだけなので、
google.script.run」の部分を読むのにちょっと手間取りました。
あとラムダ式みたいなのも慣れてないので、読むのに少しだけ手間取ります。
javascriptに慣れていたら普通に読めるんですかね。

あと今回の記事で初めてコードを載せて見ました。
prettyprintというものを使いましたが、導入が簡単で便利ですね。
ですが行番号がなぜか5の倍数しか表示されないのはなんとかしたいですね。
また、背景を黒くしたいです。
普段のエディタの近い配色にしたいです。