Translate

2021年5月20日

Googleドキュメントを使ってGASで差し込みメールを出す(HTMLメールも可)

ゾウでもわかる Google Apps Script

GASでメールを送信をするのは簡単ですが、メール本文を整形するのが面倒です。

しかし、Googleドキュメントでメールのテンプレートを作れば簡単です。またメール本文の一部を変数として、送付する人の名前などを書き換える差し込み機能を使うこともできます。

テキストメールだけでなくHTMLメールでも同じようにGoogleドキュメントでテンプレートを作成して差し込みメールを出すことも可能です。

今回説明するのは、

  • Googleドキュメントでメールのテンプレートを作る
  • メール本文の一部を送信する人によって書き換える
  • HTMLメールの送信

についてです。

実際に送付されるHTMLメールはこんな感じです。赤字にしている部分が差し込みです。画像も添付しています。

HTMLメールサンプル

テキストメールのサンプルは下記となります。テキストメールなので画像はなく、リンクも使えないのでURLの記載となります。

テキストメールサンプル

メールのテンプレート作成する

先ずは、Googleドキュメントでメールのテンプレートを作成します。


テキストメールのテンプレート

テキストメールは、見たまんまなのでとても簡単です。

赤字が差し込み用の変数です。

面談日のお知らせ

[value1]さん、面談の日程が確定しました。

日付 :[value2]
時間 :[value3]

詳細については、下記URLからご確認ください。

差し込みとするのが赤字の部分です。プログラムで判断できる文字列であれば何でも構いませんが、

  • [value1] ・・・ 氏名
  • [value2] ・・・ 日付
  • [value3] ・・・ 時間

としています。


HTMLメールのテンプレート

続いて、HTMLメールのテンプレートとなります。橙色がHTMLタグです。

<h2>面談日のお知らせ<h2>

<p><strong>[value1]</strong>さん、面談の日程が確定しました。</p>

<ui>
    <li>日付 :<span style="color: red">[value2]</span></li>
    <li>時間 :<span style="color: red">[value3]</span></li>
</ui>
 
<p>詳細については、<a href="https://walking-elephant.blogspot.com/2021/05/shower-head.html">こちら</a> からご確認ください。</p>

<img alt="ゾウでもわかる Google Apps Script" height="180px;" src="https://lh3.googleusercontent.com/StoB14GWX9gSlf6HgsiRuWEn9TyN7XIejqUeWh9GCxQmrGVVxMwXE19xThkj_VvgVOIAdF_3iACbSJyJYPG1hro-bnl9G7yEqMoCWHxgP43oCe-0RHSMTt3fDjoOcLKVSkGbeerL9vI=s16000" title="ゾウでもわかる Google Apps Script" width="320px;" />

GASでメールを送信する

サンプルプログラムは、下記の3パートから構成されています。

  1. Googleドキュメントを読み込む
  2. 読み込んだコンテンツから特定文字列を置換する
  3. HTMLメールを送信する

HTMLメールで送信しますが、HTMLメールが受信できない環境であればテキストメールが表示されます。

サンプルコードは下記になります。

function testMail() {
/***************************************************
* Googleドキュメントを読み込む
***************************************************/
  //GoogleドキュメントのID
  var textDocId = '...1234567890...'
  var htmlDocId = '...abcdefghij...'

  //テキストメール テンプレートの取得
  var txtDoc = DocumentApp.openById(textDocId)
  var txtTemplate = txtDoc.getBody().getText()

  //HTMLメール テンプレートの取得  
  var htmlDoc = DocumentApp.openById(htmlDocId)
  var htmlTemplate = htmlDoc.getBody().getText()

/***************************************************
* メール本文の特定文字列を置換する
***************************************************/
  //変数の設定
  var var1 = 'タカハシ'
  var var2 = '2012年5月14日(金)'
  var var3 = '13:00'

  //プレーンテキスト内の変数を置換
  var bodyText = txtTemplate.replace('[value1]',var1).replace('[value2]',var2).replace('[value3]',var3)

  //HTML内の変数を置換
  var bodyHtml = htmlTemplate.replace('[value1]',var1).replace('[value2]',var2).replace('[value3]',var3)
/*************************************************** * HTMLメールを送信する ***************************************************/ var mailTo = 'sample_mail@gmail.com' var subject = 'テストメール' GmailApp.sendEmail( mailTo, subject, bodyText, { htmlBody:bodyHtml } ) }

Googleドキュメントを読み込む

Googleドキュメントで作成したテンプレートをIDを指定して読み込みますが、6行目がテキストメール、7行目がHTMLメールのGoogleドキュメントのIDとなります。

5. //GoogleドキュメントのID
6. var textDocId = '...1234567890...'
7. var htmlDocId = '...abcdefghij...'

Googleドキュメントの編集URLが下記の場合、赤字の部分がIDです。

https://docs.google.com/document/d/...1234567890.../edit

Googleドキュメントで作成したテンプレートの値に変更してください。

10行目でGoogleドキュメントで作成したテキストメールのテンプレートを上記のIDを指定して開いて、11行目で内容をテキストとして変数 txtTemplate に代入しています。

  9. //テキストメール テンプレートの取得
10. var txtDoc = DocumentApp.openById(textDocId)
11. var txtTemplate = txtDoc.getBody().getText()

HTMLメールのテンプレートも同じように14-15行目で変数 htmlTemplate に代入します。

これで、Googleドキュメントの読み込みは完了です。


メール本文の特定文字列を置換する

差し込み部分の説明です。

21-23行目でメールに差し込む値を定義しています。

20. //変数の設定
21. var var1 = 'タカハシ'
22. var var2 = '2012年5月14日(金)'
23. var var3 = '13:00'

26行目がテキストメール・テンプレートから読み込んだ値の置換、29行目がHTMLメール・テンプレートから読み込んだ値の置換です。

25. //プレーンテキスト内の変数を置換
26. var bodyText = txtTemplate.replace('[value1]',var1),.....省略.....
27.
28. //HTML内の変数を置換
29. var bodyHtml = htmlTemplate.replace('[value2]',var1)......省略.....

replaceを使って文字列を置換しています。

Strings.replace('置換前の文字列','置換後の文字列')

変数をひとつにして説明すると、下記の例では、txtTemplate にある [value1] を探して 細野 に置換した内容を bodyText に代入しています。

var bodyText = txtTemplate.replace('[value1]','細野')

差し込みが多い場合には下記のように分割することもできます。

var bodyText = txtTemplate.replace('[value1]',var1)
var bodyText = bodyText.replace('[value2]',var2)
var bodyText = bodyText.replace('[value3]',var3)

HTMLメールを送信する

メールを送信するのには GmailApp.sendEmail を使います。

GmailApp.sendEmail(送付先メアド, メールタイトル, 本文, {オプション})

34-35行目で mailTo に送信先アドレスを、subject にメールタイトルを代入しています。

自分のメールアドレスに変更してください。

34. var mailTo = 'sample_mail@gmail.com'
35. var subject = 'テストメール'

37-44行目がメール送信部分です。

HTMLメールを送信するので、オプション部に htmlBody:'HTMLメール本文' を指定し、本文 にはHTMLが表示できない場合のテキスト文を指定しています。

こうしておけば、HTMLメールを表示できない環境の場合には、テキストメールが表示されます。

37. GmailApp.sendEmail(
38.   mailTo,
39.   subject,
40.   bodyText,
41.   {
42.     htmlBody:bodyHtml
43.   }
44. )

テキストメールを送信する

テキストメールとして送信する場合は、サンプルプログラムのオプション部を削除して下記のように変更します。

GmailApp.sendEmail(
  mailTo,
  subject,
  bodyText
)

シートの文字装飾された文字列をHTMLメールで送信する

コメントに質問を受けたのでスプレッドシートから値と文字装飾(色、太文字)を読み込んでHTMLメールを送信するサンプルプログラムを作成しました。

読み込むシートには、A1セルに赤字太文字で"象と散歩"と入力しています。

サンプル スプレッドシート

プログラムでHTMLタグを生成する

セルの文字色は、.getFontColor()で取得できます。太字かどうかは、.getFontWeight()でわかります。戻り値が、boldなら太字、太文字でなければnormalです。

次にHTMLの生成ですが、セルの文字が太文字かを判断して、太文字であれば<strong>タグで囲みます。文字色は必ずセットされているので、<p style='color:#カラーコード>で括ります。

文字色は必ずセットされるので、装飾文字のパターンは太字の有無の2パターンですが、文字色が「黒」か「他の色」かの4パターンで生成されるHTMLを下表に示します。

字幅太字文字色HTML
象と散歩なし<p style='color:#000000'>象と散歩</p>
象と散歩なし<p style='color:#ff0000'>象と散歩</p>
象と散歩太字<p style='color:#000000'><strong>象と散歩</strong></p>
象と散歩太字<p style='color:#0000ff'><strong>象と散歩</strong></p>

下記がサンプルコードとなります。

function sendFormattingEmail() {
  // シート名を指定
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1")
  // セルの内容を取得
  let cellValue = sheet.getRange("A1").getValue()
  // セルの文字色を取得
  let cellFontColor = sheet.getRange("A1").getFontColor()
  // セルの文字が太字かどうかを判定
  let cellIsBold = sheet.getRange("A1").getFontWeight() === "bold"

  Logger.log(cellValue)
  Logger.log(cellFontColor)
  Logger.log(cellIsBold)

  // 宛先メールアドレス
  let mailTo  = "sample_email@gmail.com"
  // メールの件名
  let subject = "文字色と太文字を指定したメール"

  // セルの値を取得
  let body = cellValue
  // 太字の場合はstrongタグで囲む
  if (cellIsBold) {
    body = "<strong>" + body + "</strong>"
  }
  // 文字色をstyle属性で指定
  body = "<p style='color:" + cellFontColor + "'>" + body + "</p>"

  Logger.log(body)

  // HTML形式のメールを送信
  GmailApp.sendEmail(mailTo,subject,'',{htmlBody:body})
}

上記を実行すると、セルに設定された文字装飾(文字色と太字有無)で、HTMLメールを送信することができます。(2023.7.23追記)


GASの基礎を学べる参考図書

ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。

詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。

Udemy オススメ講座

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

【新IDE対応】Google Apps Script(GAS)の基礎を完全習得

講師:事務職たらこ

印象に残りやすい手書き風スライドを用いGASの基本的なプログラミングを気軽に学ぶことができる。本講座でGASを活用した自動化ができるレベルにはなれないが、基礎としては十分。

2021年5月13日

浄水シャワーヘッドの効果と選び方

タカギ キモチイイ浄水シャワピタ

水道水に含まれる塩素は、髪の毛や肌のタンパク質を酸化させるため

  • 髪の毛のキューティクルを分解
  • 肌の脂質を溶かして保湿力を低下

と、髪にも肌にもよくないそうです。


浄水シャワーの効果

浄水シャワーヘッドは、水道水に含まれる残留塩素を減らし、皮膚や毛髪への刺激を減らす効果があるとされています。

またアトピー性皮膚炎に対する浄水シャワーの効果も研究されているようですが、浄水器協会では下記のように記載されています。

多くの臨床試験や試用によって効果やよい結果も得ていますが、すべての人に適合するわけではありません。しかし、消毒用残留塩素を取り除くことで、髪やお肌にやさしい”浄水シャワー”としてご使用いただけます。

【引用】浄水シャワー-浄水器協会

塩素は水道水を殺菌するためには必要で、人には害がないとされていますが、魚も生きられない水がダメージがある髪や肌に良いとは思えません。


浄水シャワーに使われる ”ろ材”

浄水シャワーヘッドのろ材には、

  • 活性炭
  • 亜硫酸カルシウム
  • アスコルビン酸(ビタミンC)

の3種類があります。活性炭は塩素を吸着させる方法ですが、亜硫酸カルシウムアスコルビン酸は化学反応で残留塩素を低減(除去)します。

ろ材の一般的な特徴を下表にまとめてみました。

浄水シャワーのろ材
ろ材 交換頻度 除去反応速度 濾過能力 シャワー水量
活性炭 少ない 遅い 徐々に低下
亜硫酸カルシウム 2-3ヵ月 早い 徐々に低下
アスコルピン酸 2-3ヵ月 早い 一定

活性炭

活性炭の材料はヤシの殻や石炭なので化学薬品が苦手というのであれば活性炭の浄水シャワーがオススメです。

カートリッジの交換頻度が少なくて済むのでランニングコストが安いというメリットもあります。


亜硫酸カルシウム

亜硫酸カルシウムは、亜硫酸イオンを水に溶解しながら残留塩素と反応させて分解します。

反応温度は40℃前後で水だとあまり反応しないので、浄水と原水の切り替えがなくても、お風呂掃除のときに水で洗えば浄水を無駄にしません。

ろ材の成分がお湯で溶け出していくので、徐々に塩素除去率が低下していきます。


アスコルピン酸

アスコルピン酸は、いわゆるビタミンCですが、化学反応で残留塩素を中和し、カルシウムの結晶化も防ぎます。

水溶性で徐々に減っていくので残量を目で確認ができます。ろ材が残っている限りは除去率は一定です。


浄水シャワーヘッドを選ぶポイント

安心して使えるメーカーから選択するのがいいかと思います。浄水器も扱っているというのも目安になります。

お風呂の掃除でシャワーを使うので、浄水と原水が切り替えは必須です。

下表は、自分が購入を検討するときに比較検討した浄水シャワーヘッドです。

いずれも 浄水と原水の切り替えができるタイプ で、4社とも一般社団法人 浄水器協会に属し、東レとSANEIの浄水シャワーヘッドは日本アトピー協会推奨です。

表中のカートリッジの交換目安は、一人での使用を前提とし、1分当たりの水の使用量が8ℓで、トレシャワーは10分、それ以外は8分の使用時間として計算されています。

3タイプの浄水シャワーヘッド
商品名 メーカー ろ材 総ろ過水量 交換目安
トレビーノ トレシャワー 東レ 活性炭 12,000ℓ 5カ月
ビタCシャワーヘッド TOTO アスコルピン酸 6,000ℓ 3カ月
浄水原水切替え式シャワーヘッド SANEI 亜硫酸カルシウム 5,500ℓ 3カ月
キモチイイ浄水シャワピタ タカギ 亜硫酸カルシウム 4,000ℓ 2カ月

家族構成やシャワーの利用時間によってカートリッジの交換時期は異なってしまいますが、下記の計算で目安が分かります。

交換目安日数=総ろ過水量÷1日の利用時間(分)×8ℓ

しかし、前述したように、活性炭や亜硫酸カルシウムのろ材は、塩素除去率が50%に低下する総ろ過水量を交換時期としているので、厳密に計算しなくても大体の目安で大丈夫かと思います。

ビタCシャワーヘッドならろ材が物理的になくなってしまうので交換時期は一目瞭然です。


塩素除去率50%とは

トレビーノ トレシャワー、キモチイイ浄水シャワピタには浄水能力の欄に下表にあるように除去率50%と記載されています。

商品名 総ろ過水量 除去率
トレビーノ トレシャワー 12,000L 50%
キモチイイ浄水シャワピタ 4,000L 50%

「塩素を50%しか除去できないの?」

と思ってしまいましたが、調べてみると違いました。

浄水器協議会では、遊離残留塩素濃度を1mg/ℓの40℃のお湯を浄水して、塩素低減能力が50%となる総ろ過水量をカートリッジの交換時期と定めています。

つまり、トレシャーは12,000ℓ、シャワピタであれば4,000ℓ 使うと「塩素除去率が50%以下になります」ということです。

「わかりづらい」

せめて「交換時の塩素除去率」と記載すればと思います。

SANEIも浄水器協会に属しているので同じ基準を設けているとは思うのですが、敢えてわかりづらい塩素除去率については記載していないのでしょうか、、。


動画で確認

各社の浄水シャワーの商品説明動画です。TOTO ビタCシャワーヘッドは公式の動画はありませんでした。


トレビーノ トレシャワー

「髪や肌をいたわりたい貴方に」で始まり、水道巣に含まれる残留塩素が 髪、頭皮、肌によくないとわかりやすく説明されています。


SANEI 浄水切替シャワー

シャワー音以外の音がなく、動画の中で効果については特に謳われていませんが、水流がこんな感じだよというのは十分に伝わってきます。


タカギ キモチイイ浄水シャワピタ

「飲む水は気にするのに、素肌に浴びる水は気にしないの?」という問いかけから始まった以前のPVの方が、浄水器メーカーらしくて好きでした、、、。


キモチイイ浄水シャワピタに決めた

手元でシャワーを止められる止水ボタン付きのキモチイイ浄水シャワピタをポチリと。

タカギ キモチイイ浄水シャワピタ

本体がちょっと高いかなと思いましたが、カートリッジが2個付いているので、初期投資とは悪くないかと思います。

タカギ キモチイイ浄水シャワピタ 交換カートリッジ

カートリッジの交換時期を忘れてしまいそうなので、Alexaのリマインダーに登録しておきました。

2021年5月8日

木の香りを日常生活に取り入れる

無印良品 アロマディフューザー

ふと懐かしい香りがして、過去の記憶が蘇ることがありませんか?

特定の香りが、それに結び付く記憶を呼び起こす現象をプルースト効果(現象)と言うそうで、小説家プルーストの小説が由来となっているとあります。

フランスの作家マルセル・プルーストの『失われた時を求めて』という小説の中で、主人公がマドレーヌを紅茶に浸した際、その香りで幼少時代を思い出す場面があり、その描写が元になっているということである。

【引用】においと記憶 | 日医on-line


檜と白檀は和の香り

日本人にとってのソウル・フラグランスをは、檜(ヒノキ)とお線香の香りでしょうか。

「檜舞台に立つ」と言われるように檜は日本人にとって特別な樹木で、その香りは多くの人に愛されています。檜の香りは、針葉樹の香りであるαピネン、重厚感ある樹木の香りであるαカジノールなどから構成されていて、リラックス効果もあるそうです。

また、お線香の香りは、白檀(ビャクダン)=サンダルウッドの香りです。白檀には鎮静効果や沈静瞑想効果があると言われていますが、まさにお寺のイメージですね。檜木の香りと違って白檀のスモーキーな香りは好みが分かれるかもしれません。


精油(エッセンシャルオイル)で香りを楽しむ

そんな檜や白檀の和の香りは、精油(エッセンシャルオイル)でも楽しめます。

日本アロマ環境協会によると、精油について下記のように説明されています。

精油(エッセンシャルオイル)は、植物の花、葉、果皮、果実、心材、根、種子、樹皮、樹脂などから抽出した天然の素材で、有効成分を高濃度に含有した揮発性の芳香物質である。各植物によって特有の香りと機能を持ち、アロマテラピーの基本となるものである

【引用】(公社) 日本アロマ環境協会 | アロマを楽しむ | 精油とは

油(オイル)とはありますが、実際には油ではなく揮発性の芳香物質です。

100%天然と記載されていても安価なものから高価なものまでたくさんありますが、「無印良品」やデパートなどに店舗を構える「生活の木」でなら安心なエッセンシャルオイルが購入できます。 


精油(エッセンシャルオイル)の楽しみ方

精油(エッセンシャルオイル)は揮発性なので、最も簡単な楽しみ方は木や石に染み込ませて自然に揮発させる方法です。「アロマウッド」「アロマストーン」として販売されています。

アロマストーンは珪藻土などが使われていますが、水槽用のろ過装置に入れる”ろ材”も多孔質なのでアロマストーン向けです。

簡易アロマストーン

とてもお手軽ですが、垂らしたオイルの自然気化なので、ほのかな香りを楽しむ方法です。

しっかりと香りを楽しみたいのであれば、アロマディフューザーが必須です。


生活の木のディフューザー

生活の木のエッセンシャルディフューザーは、精油を霧状の微粒子にして噴霧する方式で、水も熱も使いません。

6-21畳で利用可能とありますが、直径7.2cm 高さ13.2cmと小型で、USB電源で使えます。優れものですが、「生活の木」のエッセンシャルオイルのボトルを直接差し込むので他社の精油は使えません。


無印良品のディフューザー

無印良品のアロマディヒューザーは、水に精油を数滴垂らし超音波で振動させてミストにして香りを拡散させる方式です。

USB充電式で6時間の充電で2時間コードレスで使用できます。USB電源を挿した状態なら80mlの水で4時間連続利用ができます。

6-8畳で利用可能なもので、直径8.1cm×高さ14.5cm と、こちらも小型です。

お手軽な「生活の木」のディフューザーをポチリとしようと思いましたが、「生活の木」以外のエッセンシャルオイルが使えないので、無印良品のアロマディフューザーを購入。

小さなボディですが、いい感じで香りを広げてくれます。

無印良品 アロマディフューザー

2段階でライトの明るさを変更できますが、白色で暖色系でないのがちょっと残念です。

点灯した状態の 無印良品 アロモディフューザー

木の香りを楽しむ

精油(エッセンシャルオイル)

エッセンシャルオイルは下記に分類されるそうです。有名なラベンダーはフローラル系です。

  • シトラス系(CITRUS)
  • フローラル系(FLORAL)
  • ハーブ系(HERBACEOUS)
  • カンファー(樟脳)系(CAMPHORACEOUS)
  • ミント(MINTY)
  • スパイス(SPICY)
  • 樹脂/ムスク(RESINOUS/MUSKY)
  • ウッディ/アース(WOODY/EARTHY)

ウッディ(樹木)系に分類されるエッセンシャルオイルは、森の木や湿った土の香りを彷彿させ、森林浴をしているような心地よさを感じさせてくれます。

ヒノキ科のエッセンシャルオイルには、

  • ヒノキ
  • サイプレス(イトスギ)
  • シダーウッド(バージニア)

などがあります。

シーダーウッドは紛らわしいのですが、バージニアヒノキ科ですが、アトラスは、和名ではアトラススギと杉の名が付きますがマツ科で香りも異なります。

  • サンダルウッド(白檀)
  • ユーカリ
  • ティーツリー
  • シダーウッド(アトラス)

などもよい香りです。

ヒノキよりも木の香りを強く感じられる無印良品のシダーウッド(バージニア)の香りが気に入っています。

イノセント」にもヒノキ科のエッセンシャルオイルがあります。


テレワークも香りで捗る?

テレワークでの仕事も良い香りのもとだと捗るような気がします。昼食後であればスッキリとしたユーカリの香りが、頭をクリアにして集中力を高めてくれます。

ユーカリの精油にも、

  • グロブルス
  • ラディアータ

といった種類がありますが、グロブルスの方が「スーッ」とした香りが強いです。

無印良品のユーカリ精油は、この刺激が強いグロブルスなので頭がスッキリとします。

午前は「シダーウッド」の木の香りでリラックス。そして、午後のまどろみ時間帯には、スッキリとした「ユーカリ」の香りで、テレワークを満喫しましょう。

2021年5月5日

Beats Solo3 のイヤーパッドがボロボロになった

Beats Solo 3 のサウンドクオリティはとても高く、バッテリーの持ちもよいので気に入っています。ただ購入してから2年でイヤーパッドがボロボロになってきました。

iPhoneとMacBookAirとの切り替えもすぐにできるし、リモート会議でも活躍しているのでイヤーパッドの交換を決断。

Beats Solo 3 のイヤーパッド交換の費用を調べてみると、Beats の修理サービス料金 - Apple サポート 公式サイト に修理料金が掲載されていて 14,740円 とあります。

いくら何でも高すぎ、、、。

互換品でもいいかと Beats Solo 用の交換用イヤーパッドをAmazonで検索してみると、幾つかの種類がありますが、何も正規の修理代金の1/10程度と安価です。

自分で交換するというのは少々不安がありましたが、Amazonでの評価が6,000件以上ある、各国の先人たちが交換を試みた Beats Solo2.0 & 3 対応の SoloWITの交換用イヤーパッドを選択。

SoloWITは、SoloWIT Online によると中国のJindawei Science And Technology Co., Ltd., が扱っている商品のようです。


SoloWIT 交換用イヤーパッド

イヤーパッドのカラーバリエーションがありますが、もとの色に近いシャドーグレーを購入。

ユーザーガイドに日本語での交換手順があり、交換に必要な取り外し器具も付属しているので、手順に従って交換していくだけです。


イヤーパッドを剥がすコツ

付属品にピックのような三角形のオープナーで古いイヤーパッドを剥がしていきますが、ヘッドホンを壊してしまいそうでちょっと怖い。

説明書に「古いクッションのプラスチック製のベースを取り外す必要があります」とあるので隙間にオープナーを差し込みますが、簡単には剥がれません。

必ず慎重に操作して」との注意書に従い、テコの原理を利用して、隙間に差し込んだオープナーを捻りながら周回させると徐々に剥がれてきます。

2箇所の凸部分を壊してしま話ないように、ゆっくりと丁寧に剥がします。

本体に粘着テープが残るので丁寧に剥がしましたが、まだ粘着剤が残ってベタベタしています。

付属のクリーニングペーパー(Wet)でキレイに拭き取り、ドライシート(Dry)で仕上げます。

拭き取ると割とキレイになりました。

交換の手順にも右耳(R)から取り外すようにと記載されていますが、Beats Solo 2.0 & 3 用の交換用イヤーパッドには左右があります。充電用USBポート部分の凹部があるのが右耳となるので間違えないように。

またテープカバーを剥がすのに苦労しました。爪では剥がせなかったので、2箇所の穴の空いている部分から針を差し込んで持ち上げてみると剥がせました。

あとは、本体にある2箇所の突起とイヤーパッド側にある穴を合わせて貼り付けます。

失敗した場合の予備テープも付属されていますが、予備テープがあるということは失敗するケースがあることが想定されているということです。先ずは、テープ部分から紙を剥がす前に、試しに装着してみると、どのように貼り付ければいいかがわかります

右耳が完了したら、左耳のイヤーパッドも同じ手順で剥がして交換します。


最後の重要なステップ

粘着を安定させるために、数冊の本を挟んだ状態で8時間置いてくださいとあります。

これで交換作業は完了です。


イヤーパッドの交換は思ったよりは簡単

最初に右耳のイヤーパッドを剥がすときは、ドキドキでしたが、あとは意外と簡単でキレイに交換できました。

正規品のイヤーパッドより少し柔らかいですが装着感も悪くないし、色もフィットしています。

Beats Solo 以外にも Beats Studio 2 & 3 の交換用イヤーパッドもありますので、Beatsのイヤーパッドがボロボロになったら、我慢して使い続けないで、自分で交換してみてはいかがでしょうか。

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)となります。

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

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

お粥のお供

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

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

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

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

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

アクセス上位(過去7日間)