Translate

Post Date:2021年5月4日 

Googleスプレッドシートの更新された値を知る

ゾウでもわかる Google Apps Script

Googleスプレッドシートの特定セルの値が更新されたらかを知る方法についての説明です。

スプレッドシートでのプロジェクト計画管理については、スプレッドシートでプロジェクト計画を作成する方法 - Google Workspace ラーニング センター に説明があります。またこの中で更新を通知する方法として、通知を追加する でスプレッドシートの通知設定についての説明もあります。

これだけでも便利なのですが、ステータスが更新されたときなど特定のセルが更新されたときだけ通知をするなどは GoogleAppsScript での作成が必要となります。


onEdit()

GoogleAppsScriptではトリガーの設定をしなくても、特定のイベントに応じて動くシンプルトリガーという関数があります。詳細の説明は、Simple Triggers | Apps Script | Google Developers にありますが、スプレッドシートでは下記の3つの関数が使えます。

関数名 イベント
onOpen(e) スプレッドシートを開いたとき
onEdit(e) セルの値を変更したとき
onSelectionChange(e) 範囲選択をしたとき

onEdit を使えば、シートの値が変更されたときに実行されて、引数として変更された内容を取得することができます。慣習としてイベント時の引数として e を使っていますが、onEdit(parm) とすれば、parm を引数として使うことができます。引数で何が取得できるかの詳細は、Event Objects の Editに記載があります。

単一セルの変更なら、

  • e.oldValue
  • e.value

で、変更前の値、変更後の値も取得できますが、コピペで複数セルの値が変更された場合には使えません(残念)。但し、e.range で変更された場所を確認することができるので、行と列を指定して変更後の値であれば取得することができます。


変更されたシート名と変更内容を取得する

下記は、変更されたシート名と変更された範囲、変更内容を表示する簡単な例です。

sourceはスプレッドシートオブジェクトで、e.source.getActiveSheet() で変更イベントが発生したシートを取得できます。

function onEdit(e) {
  var sheet = e.source.getActiveSheet()
  console.log('シート名  =', sheet.getName())
  console.log('変更範囲  =', e.range)
  console.log('変更前の値 =', e.oldValue)
  console.log('変更後の値 =', e.value)
}

シート1のA1セル(空白セル)にaaaと入力してログを確認すると、下記のようにログが出力されます。

シート名 = シート1
変更範囲 = {columnEnd:1, columnStart:1, rowEnd:1, rowStart:1}
変更前の値 = undefined
変更後の値 = aaa

e.range の中身は、

  • columnEnd(終了列)
  • columnStart(開始列)
  • rowEnd(終了行)
  • rowStart(開始行)

となっています。順番が不思議な感じがしますが、全て1なので1行目1列の値が更新されたことを示しています。

※rangeを出力すると、"toString:" から "rowStart:" までの長い出力となります。次例のように必要な項目だけを指定すると出力内容を特定できます。(2022/05/05 追記)

function onEdit(e) {
  var sheet = e.source.getActiveSheet()
  console.log('シート名  =', sheet.getName())
  console.log('変更範囲(開始行)  =', e.range.rowStart)
  console.log('変更範囲(終了行)  =', e.range.rowEnd)
  console.log('変更範囲(開始列)  =', e.range.columnStart)
  console.log('変更範囲(終了列)  =', e.range.columnEnd)
  console.log('変更前の値 =', e.oldValue)
  console.log('変更後の値 =', e.value)
}

変更前の値はないので、undefined となって、変更後の値は、入力した aaa がセットされています。

次にA1セルの値を aaa から bbb に変更すると、ログは下記のように出力されて aaa が bbb に変更されたことがわかります。

シート名  = シート1
変更範囲  = {columnEnd:1, columnStart:1, rowEnd:1, rowStart:1}
変更前の値 = aaa
変更後の値 = bbb

では次に B1に AAA, B2に BBB がある状態で、この値をA1-A2にコピペします。

複数セルが更新されたので、更新前も更新後の値も取得できません。変更の範囲は rowEnd が2になったので、1から2行目の1列目の値(A1,A2)が更新されたことがわかります。

シート名  = シート1
変更範囲  = {columnEnd:1, columnStart:1, rowEnd:2, rowStart:1}
変更前の値 = undefined
変更後の値 = undefined

【注意】シンプルトリガーは、スクリプトエディターから手動でも実行できますが、手動で実行した場合には当然ですが、引数には何も入っていません。動作を確認する場合にはシートの値を変更して確認してください。


複数範囲の変更された値を取得する

前のサンプルコードで rangeでどの範囲が変更されたかは行と列の開始と終了でわかるのでこの値を使って変更内容を表示させる例となります。

変更行と変更列で二重ループにして個々の値を取得します。

3-6行目は、変更開始/終了行、変更開始/終了列をそれぞれ取得しています。

また10行目の sheet.getRange(row, col).getValue() で指定した行と列のセルの値を取得しています。

function onEdit(e) {
  var sheet = e.source.getActiveSheet()
  var rowStart = e.range.rowStart //変更開始行
  var rowEnd = e.range.rowEnd //変更終了行
  var columnStart = e.range.columnStart //変更開始列
  var columnEnd = e.range.columnEnd //変更終了列

  //変更行の確認
  for (var row = rowStart; row <= rowEnd; row++) {
    //変更列の確認
    for (var col = columnStart; col <= columnEnd; col++) {
      console.log(row + '行' + col + '列目 =', sheet.getRange(row, col).getValue())
    }
  }
}

上の例と同じく B1に AAA, B2に BBB がある状態で、この値をA1-A2にコピペします。ログを確認すると、

1行1列目= AAA
2行1列目= BBB

A1セル(1行1列目)に AAA が、A2セル(2行1列目)がセットされたことがわかります。


onEditの限界

とってな便利なonEditですが、シンプルエティターとしての限界があります。例えば、特定のセルが更新された場合にメールを送信するなどをしようとすると、

Exception: スクリプトにはその操作を行う権限がありません。

と、メール送信の権限がないと言われてエラーとなってしまいます。

メールやチャットルールに投稿するなどをする場合には、onEdit関数ではなく、トリガーを設定する必要があります。


シート変更時に関数を実行する

トリガーを選択すると、スプレッドシートの起動時、変更時などに特定の関数を実行することができます。スプレッドシートで使えるイベントは下記の4種類です。

イベントの種類 関数が実行される条件
起動時 スプレッドシートを起動したとき
編集時 スプレッドシートを編集したとき
変更時 スプレッドシートを変更したとき
フォーム送信時 フォームを送信したとき

編集時と変更時の違い

編集時」では、行の追加・削除、列の追加・削除を含めてスプレッドシートに何らかの変更があった場合に起動されますが、「変更時」では、セルの値が変更された場合だけ起動されます。

注意事項は、トリガーで起動した場合にパラメータで値が取得できるのは「編集時」だけ です。インベントの種類を「変更時」にすると、下記のようにエラーになってしまいますので、

TypeError: Cannot read property 'rowStart' of undefined

イベントの種類は「編集時」を選択 してください。

スプレッドシートの変更時に実行されるトリガー

下記の例は、変更行と変更列の二重ループではなく、getRangeで変更された値を配列として取得する方法です。

function modifiedSells(e) {
  var sheet = e.source.getActiveSheet()

  //変更行数
  var numberOfRows = e.range.rowEnd - e.range.rowStart +1
  //変更列数
  var numberOfClums = e.range.columnEnd - e.range.columnStart+1
  //変更された値を取得
  var values = sheet.getRange(e.range.rowStart, e.range.columnStart, numberOfRows, numberOfClums).getValues()
  
  console.log(values);
}

getRangeは、

Sheetオブジェクト.getRange(開始行, 開始列, 行数, 列数)

で範囲を指定して複数の値を取得できます。

9行目で変更された行数を11行目で変更された列数を求めて、変更された値を Values に格納しています。

例えば、コピペによる複数行(2行)、複数列(2列)の値が更新された場合は、下記のように表示されます。

[ [ 'AAA', 'BBB' ], [ 'CCC', 'DDD' ] ]

最初の行の変更値は、values[0][0]、values[0][1]で(AAAとBBB) で、

次の行の変更値が、values[0][0]、values[0][1]で(CCCとDDD)となります。

Post Date:2021年5月3日 

土鍋とスープジャーで作るお粥

長谷園 かまどさん 二号炊きでお粥

お粥は、柔らかく、水分量が多く、冷めにくいので、胃腸に負担をかけずに水分と栄養を補給でき、身体を温めてくれます。病人食というイメージがありますが、土鍋で作ったお粥はとても美味しく朝食に最適です。

また、お粥はダイエット食にもなります。ご飯と比べて水分量が多いので、同じお茶碗一杯でもお米を食べる量は1/2〜1/3なので量を減らしているという感覚が少なくてすみます。

身体に優しく、美味しい土鍋で作るお粥と、ランチに持ち歩く簡単お手軽お粥でお粥ライフを満喫しましょう。


お粥の効果(粥有十利)

古くは、曹洞宗の道元禅師 が書いたとされる『赴粥飯法(ふしゅくはんぽう)』に、お粥の効能である粥有十利(しゅうゆうじり)についての記載があります。

赴粥飯法(ふしゅくはんぽう)については、赴粥飯法(永平清規) - 心の指針となった永平寺の禅師 にて詳しい説明がありますが、粥有十利(しゅうゆうじり)は、漢文で下記のように書かれています。

粥有十利,十利者,一者色,二者力,三者壽,四者樂,五者詞清辨,六者宿食除,七者風除,八者飢消,九者渇消,十者大小便調適

【引用】赴粥飯法

粥有十利(しゅうゆうじり)の10個の効能についての説明は、「粥有十利(しゅうゆうじり)」の「利」とはどのようなものか。 | レファレンス協同データベース にあります。

  1. 色 (体の色つやが良くなり)
  2. 力 (気力を増し)
  3. 寿 (長命となり)
  4. 楽 (食べすぎとならず、体が安楽)
  5. 詞清辯 (言葉が清くさわやかになり)
  6. 宿食除 (前に食べた物が残らず胸やけもせず)
  7. 風除 (風邪もひかず)
  8. 飢消 (消化よく栄養となって飢えを消し)
  9. 渇消 (のどのかわきを止め)
  10. 大小便調適 (便通もよい)

お粥を食べて気力が増すかどうかは分かりませんが、後は納得ができますね。


「かまどさん」でお粥を炊く

長谷園の「かまどさん」を使うとご飯だけではなく、お粥も美味しく炊けます。

しかし、お粥を炊くときは、普段ご飯を炊くときよりも水量が多いので吹きこぼれに注意が必要です。長谷園ではお粥専用の土鍋も発売されていますが、こちらは吹きこぼれにくい構造になっています。

「これ欲しい!」


お粥の水加減

かまどさん 二合炊でお粥を炊くときは、吹きこぼれないようにお米も水の量も少なめにしています。長谷園の週間webレシピでは、三合炊きで65gのお米に対して500mlとありましたが、二号炊きだと450mlあたりが吹きこぼれしない限界値です。

お粥(全粥・七分粥・五分粥・三分粥・重湯) 東京都福祉保健局 によると、お粥を作るときの米と水の比率は

  • 全粥  米(1):水(5)
  • 七分粥 米(1):水(7)

とありますが、全粥だとしっかりとお米も感じられます。

かまどさん二合炊きであれば、下記の範囲であれば吹きこぼれなく上手に炊けます。

二合炊きでのお粥
✔ 中蓋を使わない
✔ お米は50-75g(半合)
✔ 水は300-450ml
✔ 沸騰したら中火から弱火に
✔ 火を止めてから25分間蒸らす

お米75g(半合)、水 450ml がいつものパターンです。中火で10分ぐらいで鍋蓋の穴から蒸気が吹き出したら、弱火にするのが吹き出させないコツです。

夕飯にお粥を食べるときには、もうちょっと水を少なくして400mlにしています。


ランチにお粥を持ち歩く

続いて、ランチに持ち歩ける調理時間が1分未満の超簡単お粥です。使うのはスープジャーで、白米と熱湯だけでお粥が作れます。

サーモス スープジャー

サーモス(THERMOS)のスープージャー 380ml を使っていますが、保温力の高さがお粥作りにも最適です。

容量 380ml 400ml
保温効力(6時間) 56℃以上 60℃以上

※ 380mlは生産終了となり、現在は400mlとなっています。

アイソテック2断熱構造のスープジャー専用ポーチを使えば、更に保温性が高まりますし、専用のカトラリーが入るポケットも付いているので、ランチボックスとしての完成度も高いです。

さてここからが、スープジャーでのお粥の作り方になりますが、無洗米でなくてもスープジャーにお米と水を入れてシェイクを数回繰り返せばお米を研ぐ手間も省けます。

あとは、カップラーメンと同様にお湯を注ぐだけです。

スープジャーでお粥
✔ 米 50g
✔ 熱湯 350ml
✔ 3時間放置

上記の割合は七分粥です。

サーモス(THERMOS)のスープージャー 380ml であれば、内側のラインより少し下までお湯を注げば350mlぐらいです。

3時間以上経てばお粥になりますので、朝出かける前にセットすれば、持ち歩いているだけで、昼食時にはお粥が完成しています。

サーモス スープジャー でお粥

お粥のお供

桃屋の瓶詰シリーズでちょっとづつ色々な味を味わっています。

「梅ごのみ」「江戸むらさき」を定番として、「穂先メンマやわらぎ」「きざみしょうが」などが気に入っていますが、意外なところで「食べるラー油」もマッチします。

長谷園 かまどさん で炊いたお粥

瓶詰の「なめ茸」や「うに」も捨てがたい味です。シンプルな「お粥」を華やかに彩られることができれば、飽きることなくお粥を楽しみ続けることができます。

土鍋とスープジャーでお粥ライフを満喫してください。

Post Date:2021年4月27日 

箒(ほうき)のある生活

アズマ 匠箒  匠125 とMUJI掃除用品システム

脱掃除機の生活を始めて1年が経ちますが、毎日楽しく箒(ほうき)で掃き掃除です。

「そう、楽しいんです」

掃除は仕方なくやっていた家事のひとつですが、箒を使うようになってから「掃き掃除」は、楽しい日課となりました。


掃き掃除は楽しい体験?

なぜ掃除を楽しく感じられるようになったかといえば、下記の3つの理由が考えられます。

  1. 自分でキレイにしているという実感
  2. 箒を使うという新しい掃除体験
  3. いつでも気兼ねなく掃除ができる手軽さ

自分の手で部屋をキレイにするというのは、日本の古き良き道具である箒を使った新しい掃除体験から得られる満足感です。

ちょっと大袈裟な言い方をすれば、部屋を清める儀式を体験できます。

箒での掃除の利点は、早朝でも深夜でも気兼ねなく自分の好きな時間に掃除ができます。

また手編みの箒は、部屋の片隅に吊るしていても見栄えも悪くないので、思い立ったときにサッと掃除を始めることができるのもいいところです。


掃除機は箒より優れている?

箒を手にする前は、どの家庭でも掃除機が使われているのは、掃除機の方が部屋をキレイにすることができるからだと思っていました。

しかし、箒で部屋の掃き掃除をしてみると掃除機に負けず劣らずの清掃能力です。大きな違いはゴミの処理方法にあります。

掃除機は、ゴミやホコリを吸引する機械です。

掃除機(そうじき)は、ゴミやホコリを容器内に回収する家庭電化製品(掃除用吸引機)である。しばしば電気掃除機(でんきそうじき)ともいう。

【引用】掃除機 - Wikipedia

一方、箒は ”掃き出す” までが仕事領域です。

箒で ”掃き出す” から、掃除機で ”吸い取る” へと掃除スタイルが変わったのは、高度成長期に普及した団地という住環境の変化の影響が大きいとあります。

団地では外に掃き出すことはできないので、掃き集めたゴミを回収しなければなりません。

しかし、チリトリでは細かいゴミ(チリやホコリ)を残さずに回収するのは難しいことから、

掃除機 > チリトリ

という関係性が生まれ、

掃除機 > 箒

という掃除機優位論になったのではないかと思います。


”吸い取る” から ”吸着させる” に

掃き出したゴミの問題を解決してくれるのはコロコロ(粘着カーペットクリーナー)です。掃き集めたチリやホコリ、髪の毛などもしっかりとキャッチしてくれます。

”吸い取る” から ”吸着させる” への変化は、掃除機優位論をも覆す可能性を秘めています。

「フローリングでコロコロを使って床にシートが貼り付かないの?」

MUJI掃除用品システム カーペットクリーナーと木製ショートポール

と懐疑の念を抱かれるかもしれませんが、

ゴミを掃き集めた状態であれば、シートが床に貼り付いてしまうという悲劇は回避できますし、心配であれば粘着力の弱いフローリング専用シートもあります。


掃き掃除は立位で

箒で掃き集めながら直ぐにゴミをキャッチするには、立ったまま使える柄の長いコロコロとの組み合わせが最強です。

無印良品のカーペットクリーナーと木製ショートポール

無印良品のカーペットクリーナーと木製ショートポールを組み合わせれば見た目にも素敵な粘着式チリトリになります。付属ケースはスタンドにもなるので収納にも便利です。

木製ショートポールは楽天の無印良品公式で購入できます。


右手に座敷箒、左手にカーペットクリーナーという両刀使いで掃除ができます。


敷物の上の掃き掃除

何の根拠もなく、箒はフローリングや畳であれば掃除はできるけど、敷物のなどの掃除には不向きではないかと思っていました。

しかし、毛足の長い室内用マットに埋もれているゴミも、しっかりと、かき出してくれます。

アズマ匠箒で室内用マットを掃く

毛足が短いカーペットは、もちろん問題なくホコリやゴミをかき出してくれます。

アズマ匠箒でカーペットを掃く

部屋全体がロールカーペットだと掃き出す場所がないので、箒での掃除は難しいかもしれませんが、部分的な敷物であれば、箒で十分に掃除ができます。


座敷箒(江戸箒)は伝統工芸品ではない

国産の座敷箒は高価ですが、掃除機の買い換えを検討しているのであれば比較可能な値段です。

「箒を試したい!」というのであれば、実用品としての価格帯で提供するために、タイに手編み箒の生産ラインを持つアズマ工業の座敷箒がオススメです。

アズマ工業の手編み箒については、象と散歩: 掃除の基本は「掃いて」「拭く」(吾妻箒)で詳しく書いています。


新しい掃除体験

箒は、いつでも気兼ねなく掃除ができ、Echoでサステナブルな掃除用具です。

掃き掃除のあとはフローリングワイパーで拭き掃除をして仕上げます。フローリングワイパーについては、象と散歩: 掃除の基本は「掃いて」「拭く」(フローリングワイパー編)で書いていますので興味があれば読んでみてください。

「BALMUDA The Cleaner」も掃除機としての機能より、『スイスイとフローリングワイパーのように掃除ができる』という、新しい掃除体験を強く意識した製品です。

箒での掃き掃除も新しい掃除体験ですが、手料理やDIYと同じように、自分がやったことに対して、その価値を過大評価するイケア効果(IKEA effect)に近いのではないかと思います。

コロナで生活様式が変わった今だからこそ、掃除を楽しむ時間に変えてみませんか。

象と散歩:人気の投稿(過去7日間)