30代SEの自由帳

最初のタイトルは頓挫した

最近、電気代がやばいのでGASで検針用フォームを作ってみた

なぜか知らないけど、毎月電気代が上がってる。。
これまで冬だし電気使うよね~位だったのが、4月も上がった。。
食洗器が原因かと思ってやめてみたけど、5月分はさらに上がった。。。

もう月単位じゃ調査しきれないから、毎日検針して日単位で傾向とろう!
Googleスプレッドで管理すれば、グラフも作れるしいい感じよね。

けど、いちいちシート開いて入力する日付のセル探して入力とか面倒・・・

はい。ってことでやっと本題です。
早速ブログ名のウソが発覚しましたが、実はエクセルvbaはちょっとお遊び程度に弄ったことありました。
GoogleスプレッドでもGAS(Google Apps Script)で同じようなことができるとのことでやってみました。

対応概要

  • Googleフォームから昼間/夜間用の電力量計検針結果を入力して、入力日に対応したセルに結果を反映させる
  • 各入力項目の説明欄に前回の検針値を反映させる(こっちは使ってみてから改善した点)

要点

フォームの入力結果を取得

  • 引数を1つだけ持つ関数を作成
function inputData(e){
// eに回答結果が渡ってくる

   // 設問に対する回答を取得
    var dayVal = e.namedValues["設問名"];
}
  • 作った関数を[スプレッドシートから],[フォーム送信時]をトリガーとして実行するように設定

取得した結果をセルに反映

// スプレッドシートの取得
var ss = SpreadsheetApp.openById("スプレッドシートID");

// 現在時刻を取得 ※回答からタイムスタンプも取れるらしいけど扱い方不明なのでこっちで改めて取得
var nowDate = new Date();
var trgYear= nowDate.getYear()+1900; // 1900年=0として取得される
var trgMonth = nowDate.getMonth()+1; // 0オリジンで取得される
var trgDay = nowDate.getDate();

// シートの取得
var sht = ss.getSheetByName("シート名");

// セルに値を反映
sht.getRange(行, 列).setValue(設定値);

取得した結果をフォームの説明欄に反映

// フォームの取得
var frm = FormApp.openById("フォームID");

// フォーム上の設問を取得。設問順に配列でとれる
var listItems = frm.getItems();

// 指定した設問の説明欄に値を反映
listItems[0].setHelpText("設定値");

まとめ

とりあえず、やりたいことで調べて見つかった内容を参考に実装してみた。 リファレンスとか見たわけじゃないので、解釈間違いや、ほかに効率いい方法ってものあるかも。

というか、いまいちどうやって記録残せばいいかイメージが固まってないですね。。
今回ので言うと"フォームID"ってどこ見ればわかるの?とか、設問名って具体的にどこを指してるの?とかSSあったほうが良いような。。
ただ、いまの内容を書くだけでもコード組むより時間かかった気がする1から、どこまでの記録残すのか? どの単位で区切るのか?的なものはもう少し考えないといけないですね。2


  1. 労力的な体感だけの話で実はそうでもないかも

  2. この[まとめ]の項目も、[要点]で終わったら、尻切れトンボ感が強かったから苦肉の策で書いてるだけだったり