それ、うまいのか?

... 記憶の残滓

シート名の自動設定 @Google Spread Sheet

お題

googleスプレッドシートの質問です。

シートが1~31まであるのですが、各シートのA1に日付(1/1月曜日)を入力すると、各シート名が自動的に先程、入力した日付になる、という事は出来るのでしょうか?

googleスプレッドシートの質問です。 シートが1~31まであるので… - 人力検索はてな

Google Spread Sheet についての質問。

迷える子羊たちよ……

スクリプトが必要ならそのコードも教えていただきたいです。
依頼ならプログラム制作会社に頼むと良いですよ。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10152947550#a375906621

という「サービス、探しています」カテゴリのマスターから素晴らしい回答がついた後、人力検索の匿名質問を経て、通常質問へ。

相手してくれないと拗ねるよ

Google Apps Script は、知ってても損にはならないんだろうなあ、とは思う。
匿名質問はスルーしたけど、通常質問なら調べてみても良いかな、と。
日付だったら文字列で設定しているわけはないよなあ、とは思いながら、回答はちょっと手抜き :-p

一応、こんな回答の用意はしていた。

function myEdit(event){
    var sheet = event.source.getActiveSheet();
    var d = new Date(sheet.getRange("A1").getValue());
    var formattedDate = Utilities.formatDate(d, "JST", "MM/dd EEE");
    sheet.setName(formattedDate);
}

値の取得は、value プロパティではなく、getValue() メソッドなのだ。
https://developers.google.com/apps-script/reference/spreadsheet/range

そのシートのスクリプト、なの?

メニューの「ツール」から「スクリプトエディタ」を選ぶと、別タブでスクリプトエディタが起動する。
ドメインのツールとして立ち上がってくる。
プロジェクトとか、ファイルの名前とか、関係がよく分からない。
スクリプトエディタを起動したシートを閉じると、スクリプトエディタのタブも閉じるし、別のシートを開いてみると、先ほど作成したスクリプトは表示されないので、紐づけはされているっぽい。

というようなことは、ここに書いてある。
https://developers.google.com/apps-script/guides/bound

Simple Triggers と Installable Triggers

VBA でいうところのイベントは、Google Apps Script では Trigger という。
二種類の実装があって、Simple Trigger というのは特定の名前で関数を作っておけば勝手に呼び出してくれるというもの。VBAイベントハンドラと同じタイプ。
まずは Simple Triggers を試してみたものの、起動がかかっていない気がする(それとも、エラーが出てるの?)。
よく分からないので、Installable Triggers という方も使ってみた。

メニューの「リソース」から「現在のプロジェクトのトリガー」を選択して、トリガーを登録。
関数 myEdit を、イベントの「スプレッドシートから」と「値の変更」を選択して「保存」。
実行の許可を求めてくるので、画面にしたがって実行を許可。

一応動いたんだけど、動かなくなったり、また動いたり。
どうやら、トリガーの一覧から修正をかけると、起動がかからなくなるみたいだ。

  • スクリプトの関数名を変更。一覧から関数を選択し直す → 駄目
  • トリガーの種類を「値の変更」から「編集時」に変更 → 駄目

トリガーをいったん削除して、もう一度登録し直すと起動がかかるようになる。

後、コードを編集すると「ファイルの保存」をしないと反映されない。
普通にエディタを使ってるのと同じと言えば同じなのだけれど、スプレッドシートは逐一保存されるし、VBAスクリプトエディタのイメージで使ってると、つい。

などという軽めの地雷があるのだけど、質問者はその辺りは自己解決できるらしい。
# 質問しなくても、解決できたんじゃね?

関連するリファレンスは、この辺り。
https://developers.google.com/apps-script/guides/triggers/
https://developers.google.com/apps-script/guides/triggers/installable

曜日の日本語表示

ライブラリの Utilities クラスの formatDate メソッド。書式の指定は java の SimpleDateFormat のものが使える。
https://developers.google.com/apps-script/reference/utilities/utilities#formatDate%28Date,String,String%29
https://docs.oracle.com/javase/jp/6/api/java/text/SimpleDateFormat.html

java の SimpleDateFormat の E(曜日のテキスト)はロケールを考慮してくれるのだけれど、Google Apps Script では英語表記オンリーっぽい。
stackoverflow には、こんな質問が。自分で文字列に置き換えるしかないのか、やっぱり。
http://stackoverflow.com/questions/20051445/how-can-i-have-the-date-in-french-locale

ちなみに、タイムゾーンは固定で書かなくても、SpreadsheetApp.getActive().getSpreadsheetTimeZone() で取れるらしい。
http://stackoverflow.com/questions/18596933/google-apps-script-formatdate-using-users-time-zone-instead-of-gmt

シート状の表示がそのまま取れる方法がないかな、と思ったのだけれど、こちらも見つからず orz

表示形式の指定って分かりにくい

質問にあった日付の表記は「カスタム表示形式」を使っているんだろう。
これが、スプレッドシートの操作がちょっと分かりにくい。

メニューの「表示形式」から「数字」→「表示形式の設定」→「カスタム数値形式」ときて、

m"/"d"("dddd")"

と設定する。
「その他の日付や時刻の形式」であれば、書式文字を知らなくてもある程度対話的に設定できる。

Excel では曜日の指定が、ddd と dddd が英語表記で、aaa と aaaa が日本語表記だったけど、スプレッドシートは表示言語での自動切り替えで ddd と dddd しか受け付けてくれない。

とりあえず、締め

デバッグの仕方だとか、アドインとか、まだ色々ありそうだけど、とりあえず お腹がいっぱいになったので、ここまで。



エラーがあると、一日 遅れてメールとか来るのね。
console が未定義とか。
javascript かと思ってたら、サーバサイドで解釈されるのか(多分)。