Translate

2022年1月29日

掃いて、拭く、掃除は意外と楽しい

アズマ工業 座敷箒 匠125

お正月に神田明神が監修している「掃き清める新しい暮らし 神様が宿る家の清め方」を読みました。本書の帯に「掃除は最強の厄除け!」とありますが、「掃き清める」とは確かに神々しい感じのするの言葉です。

八百万の神が宿らなくとも、朝の掃き掃除は、清々しい一日の始まりと、適度に身体を動かすことで活動意欲を与えてくれます。

掃き掃除だと集めた塵や埃を目に見えるので「部屋が、こんなにも汚れているのか!」と実感するので、こまめに掃除しようという気持ちになります。また掃除することで部屋にも愛着が湧きます。


必要な掃除用具は3つ

掃除の基本は、掃き掃除と拭き掃除ですが、

  • 箒(座敷箒・棕櫚箒)
  • 柄の長いコロコロ(高性能チリトリ)
  • 一本柄のフローリングワイパー(拭き掃除)

と、必要な掃除用具は3つだけです。

フローリング、畳、カーペットでも座敷箒で掃いて、コロコロで掃いたチリや埃をキャッチします。畳とフローリングは、仕上げにフローリングワイパーにウェットシートを装着して拭き掃除をします。


箒(ほうき)

箒には、座敷箒(ざしきほうき)と

座敷箒(江戸箒):アズマ 匠107

棕櫚(しゅろほうき)箒があります。

棕櫚箒(鬼毛):アズマ 匠114

歴史的には板間を掃除する棕櫚箒の方が古く、畳敷きが広まった江戸中期以降に座敷箒が生まれたとあります。座敷箒は江戸箒とも呼ばれていますが、東日本では座敷箒、西日本では棕櫚箒が普及しました。

棕櫚箒には皮(かわ)箒と鬼毛(おにげ)箒がありますが、皮箒は棕櫚の皮を束ねて穂先部分をほぐしたもので、鬼毛箒は棕櫚の皮を解して繊維状にしたものを束ねています。

鬼毛であれば穂のボリュームがあるので畳にも向いています。


短柄(みじかえ)と長柄(ながえ)

箒の持ち手には、短いもの(短柄)と長いもの(長柄)があります。柄の短い箒は片手で、柄の長い箒は両手で掃き掃除をするように作られています。

手軽に掃除ができるようにと軽めの座敷箒のアズマ 匠125(400g)を選びました。しかし、400gでも片手での掃き掃除にはちょっと重たく感じます。部屋中の掃き掃除をするのであればこの重さが限界です。

手の力に自信がなければ、両手で持って掃除をする長柄か、次に紹介するカバー箒の選択が無難です。


手軽なカバー箒

最初に購入したカバー箒もまだ活躍しています。

US103 床を優しく掃けるほうきS

カバー箒は、シンプルな作りなので、とても軽く、片手で ”ささっ” と掃除をするのに適しています。

棕櫚タイプのカバー箒もあります。

カバー箒は手編みの座敷箒よりも穂が少ないので、掃き心地と機能的には若干劣ります。しかし、「コスト」と「軽さ」を重視、セカンド箒として使う、という方にはオススメできます。


最初の1本としてお薦めする箒

アズマ工業の匠125は、普段使いの座敷箒としてオススメできる一本です。

タイの箒職人が作る手編み箒は、しっかりとした作りですが、400gと手編みの座敷箒としては軽い方です。しかし、穂量は適度にあるので掃き心地はしなやかです。

軽いといっても片手で部屋中を掃き掃除すると手首に疲労を感じる重さです。軽さを求めるのであればカバー箒ですが、掃除のモチベーションを高めるには見た目も重要です。また部屋に吊り下げておいてもいい感じです。

何よりも伝統工芸品としてではなく、実用的な箒としての価格設定がありがたいです。

箒があれば掃除機は必要ありませんが、セカンド掃除機の代替としてもアズマ工業の座敷箒はオススメできます。

匠125はアズマ工業のサイトでは取り扱いがなくなっています。穂量も多いひとつ上のランクの匠107という選択肢もありかと思いますが、少しでも軽さを求めるのであれば、いまのうちに購入することを勧めます。


柄の長いコロコロ

柄の長いコロコロ(カーペットクリーナー)は掃き掃除には必需品です。

象と散歩: 箒(ほうき)のある生活でも記載しましたが、掃いたゴミは、コロコロで取るのが楽です。チリトリではきれいにゴミをとりきれません。現代の家での掃き掃除では、箒と長柄コロコロ(粘着式チリトリ)は不可分の関係にあります。

通常のコロコロだと、掃いた後に「かがむ・しゃがむ」そして「立つ」といった一連の動作が必要となり苦痛です。

柄が長いコロコロであれば立ったまま使えるので、掃きながらゴミを粘着させることができます。

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

アルミのポールもありますが、木製ショートポールがオススメです。

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



一本柄のフローリングワイパー

最後が拭き掃除に使う、一本柄のフローリングワイパーです。一本柄タイプのフローリングワイパーは数多くありません。

象と散歩: 掃除の基本は「掃いて」「拭く」(フローリングワイパー編)でも紹介していますが、Amazonで購入できる 山崎産業(コンドル) DailyCleanフローリングワイパー300 は実用性、耐久性ともにお薦めできるフローリングワイパーです。

掃き掃除のあとにウェットシートを装着して拭き掃除をします。また、ドライシートを装着をすればちょっとした掃き掃除代わりにもなります。

無印良品が近くにあるのであれば、象と散歩: 最強のフローリングモップで紹介している無印良品 掃除用品システム・木製ポール(110cm)は、簡易シートだけでなく、ドライモップやウェットモップも取り付けられるので、掃除の幅が広がります。


やっぱり欲しい棕櫚箒

鬼毛の棕櫚箒も使ってみたいなと思いながらなかなか手を出せずにいます。

棕櫚の皮を解してコシのある繊維だけを選んで束ねた鬼毛の棕櫚箒は、価格もそれなりに高価です。

アズマ工業は、実用的な箒を低価格で提供してくれているので、棕櫚箒を買うなら匠114かと思っていますが、アズマの中でも鬼毛の棕櫚箒は高価です。

それでも欲しいなあ、、、


スキマ掃除用の箒

部屋のコーナーや、家具の隙間など、掃き掃除がしにくい場所ように、穂幅が10cmのモダンブルーム短柄を購入しました。

アズマ工業 モダンブルーム 短柄

家具の多い入り組んだ洋間に」とありますが、まさに下写真のような感じで使っています。座敷箒を縦にして使うよりも断然に掃除しやすいです。

アズマ工業 モダンブルーム 短柄 MB135

大きな床面を履くのには不便すぎる箒ですが、スキマ掃除にはとても重宝しています。


掃き掃除のメリット

象と散歩: 箒(ほうき)のある生活では、掃き掃除での掃除体験には、イケア効果(IKEA Effect)があると記載しました。

しかし、脱掃除機生活になってから掃除が丁寧になったのは間違いがありません。また手軽にいつでも掃除できることから、こまめに掃除をするようになりました。

箒を使った掃き掃除によって、下記の5つのメリットが得られます。

  1. 朝の掃除で清々しい1日のスタート
  2. 部屋の汚れを知る
  3. 時間帯を気にせず掃除ができる
  4. こまめに掃除をするようになる
  5. 掃除が楽しくなる

箒はエシカルな掃除用具であるとともに、何よりも”掃除を楽しく”してくれる素晴らしい道具です。箒で履くと不思議と拭き掃除もと思えます。

2022年1月3日

GASでシートを処理するなら配列を使え!

ゾウでもわかる Google Apps Script

GoogleスプレッドシートをGAS(Google Apps Script)で処理するのであれば配列を覚えましょう。配列を使ってシートの読み書きを一括で行うと処理が格段に速くなります。


なぜ配列を使うのか

GASには、

  • Google Sheets のアクセスに時間がかかる
  • 6分で処理が強制停止される

という制約があります。

Googleスプレッドシートを操作するときに

  • getRange()
  • getValue()/getValues()
  • setValue()/setValues()
  • getLastRow()/getLastColmun()

などのメソッドを使いますが、これらの呼び出しには時間がかかります。

行数が多いシートでは、1行づつシートを読み書きするのと、配列で一括で読み書きするのでは分単位で処理時間が違ってきます。


二次元配列とは

「でも、配列って難しそう、、、」

と、思われがちですが、二次元配列はシートと同じと考えれば簡単です。下記のように行と列で表記されます。

values[行][列]

valuesは変数名です。後ろに続く最初の[]が行で、次の[]が列です。シートの"A1"という表記はA列1行目と列行の順番ですが、配列は行列の順番です。

注意点としては配列のインデックスは0から始まるので、 A1と同じ1行1列目のデータはvalues[0][0]となります。

  • 二次元配列はシートと同じ行と列
  • 表記の順番は[行][列]
  • インデックスは0から始まる

これだけ理解できれば配列を自在に扱うことができます。

では、下記がシートで考えた場合にどのデータを指しているか考えてみてください。

  • values[1][2]
  • values[2][0]

答えは、

  • 2行3列目のデータで C2
  • 3行1列目のデータで A3

です。

また、values[0]と記載した場合は1行目のデータとなり、values と[]を付けなければ配列全体となります。


サンプルデータで配列の中身を確認する

実際に、4行3列のサンプルデータで二次元配列を確認していきます。

二次元配列のサンプル

下記のデータをGoogleスプレッドシートにコピーしてください。

グループ男性女性
A1020
B2010
C1515

シートをシートIDとシート名から取得していますので、下記のコードの sheetId と sheetName の値を変更してください。

シートIDはURLの赤字の部分となります。

https://docs.google.com/spreadsheets/d/abcd1234/edit

シート名は、シートに付けている名前です。

シート名:シート1

下記のコードを実行します。

function myFunction() {
  //シートオブジェクトの取得
  var sheetId = 'abcd1234'
  var sheetName = 'シート1'
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)

  //配列へシート全体を読み込む
  var values = sheet.getDataRange().getValues()
	
  Logger.log(values[1][2])
  Logger.log(values[2][0])
  Logger.log(values[0])
  Logger.log(values)
}

実行結果は下記の通りです。

20.0
B
[グループ,男性,女性]
[[グループ,男性,女性],[A,10.0,20.0],[B,20.0,10.0],[C,15.0,15.0]]

最後の配列全体の出力結果はカンマ区切りでデータが続いているので一見難しそうです。しかし、各要素を見ると[]が各行のデータで、その中に各列のデータがカンマで区切られていることがわかります。


シートのデータを配列に読み込む

上記サンプルコードの8行目でシート全体(データ範囲)を読み込んでいます。

var values = sheet.getDataRange().getValues()

getRange()で、下記のように範囲を指定してシートを読み込むこともできます。

getRange(開始行、開始列, データを読み込む行数, データを読み込む列数)

データを読み込む行数と列数はgetLastRow()、getLastCloumn()でそれぞれ取得できます。

//範囲を指定して読み込む
var lastRow	= sheet.getLastRow()	//最終行の取得
var lastColumn	= sheet.getLastColumn()	//最終列の取得
var values = sheet.getRange(1, 1, lastRow, lastColumn).getValues()

しかし、シート全体を読み込むのであれば、getDataRange() で範囲を指定しない方が簡単です。


ヘッダー行の削除 shift()メソッド

計算処理などをする場合にはヘッダー行は不要です。

範囲指定で2行目から最終行を読み込むこともできますが、シート全体を配列に読み込んでから1行目を削除した方が簡単です。

function myFunction() {
  //シートオブジェクトの取得
  var sheetId = 'abcd1234'
  var sheetName = 'シート1'
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)

  //配列へシート全体を読み込む
  var values = sheet.getDataRange().getValues()
	
  //ヘッダー行の削除
  values.shift()

  Logger.log(values)
}

shift()メソッドは、二次元配列先頭の一次元配列を削除します、、、。簡単にいえば、1行目のデータの削除です。

配列の全行処理は for ... in が便利

配列を全行処理するには、for...in 文が便利です。

下記の11-13行目が for...in の記載となります。これで、in の後ろに記載した配列(values)を1行づつ処理することができます。変数 i には現在処理をしている行数が格納されます。

function myFunction() {
  //シートオブジェクトの取得
  var sheetId = 'abcd1234'
  var sheetName = 'シート1'
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)

  //配列へシート全体を読み込む
  var values = sheet.getDataRange().getValues()
  
  //各行の出力
  for (var i in values) {
    Logger.log(values[i])
  }
}

前述したように配列のインデックスは0から始まりますので、変数 i の出力結果は、0, 1, 2 となります。

普通にforループで記載するならlengthプロパティで配列の要素数(行数)を求めてループさせます。

下例では要素数(length)は3です。0行目、1行目、2行目と3回ループを回すので配列の要素数未満という条件でループさせます。

function myFunction() {
  //シートオブジェクトの取得
  var sheetId = 'abcd1234'
  var sheetName = 'シート1'
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)

  //配列へシート全体を読み込む
  var values = sheet.getDataRange().getValues()
  
  //各行の出力
  numOfRow = values.length
  for (var i=0; i < numOfRow; i++) {
    Logger.log(values[i])
  }
}

for ... in文で記載した方が簡単です。

末尾に列を追加する push()メソッド

次に男性と女性の数を合算して列の最後(D列)に追加します。

繰り返しとなりますが、配列のインデックスは0から始まりますので、男性は values[i][1] で女性は values[i][2]です。

行の最後に列を追加するには、push()メソッドを使います。

function myFunction() {
  //シートオブジェクトの取得
  var sheetId = 'abcd1234'
  var sheetName = 'シート1'
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)

  //配列へシート全体を読み込む
  var values = sheet.getDataRange().getValues()
  
  //各行の出力
  for (var i in values) {
    values[i].push(values[i][1] + values[i][2])
  }
  Logger.log(values)
}

i行目の最後に男性と女性の合算値を追加して、最後に配列全体を出力しています。


ヘッダー行の追加 unshift()メソッド

合算値を追加した新しいヘッダー行を unshift()メソッドで先頭行に追加します。

function myFunction() {
  //シートオブジェクトの取得
  var sheetId = 'abcd1234'
  var sheetName = 'シート1'
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)

  //配列へシート全体を読み込む
  var values = sheet.getDataRange().getValues()
  
  //男性と女性を合算して行の末尾に列を追加
  for (var i in values) {
    values[i].push(values[i][1] + values[i][2])
  }

  //ヘッダー行の追加
  values.unshift('グループ','男性','女性','合計')

  Logger.log(values)
}

配列のデータをシートに書き戻す

最後にシートに書き戻します。シートにデータを書き込むには、書き込む範囲を getRange() で指定する必要があります。

getRange(開始行, 開始列, 行数, 列数)

開始行と開始列は、それぞれ1行目と1列目です。

行数は、values.length です。列数は配列の最初の行の長さ values[0].length で求まります。

指定した範囲に 配列 values を書き込みます。

function myFunction() {
  //シートオブジェクトの取得
  var sheetId = 'abcd1234'
  var sheetName = 'シート1'
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName)

  //配列へシート全体を読み込む
  var values = sheet.getDataRange().getValues()
  
  //男性と女性を合算して行の末尾に列を追加
  for (var i in values) {
    values[i].push(values[i][1] + values[i][2])
  }

  //ヘッダー行の追加
  values.unshift('グループ','男性','女性','合計')

  //配列をシートに書き込む
  var values = sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
}

シートを確認すると、配列で計算した結果が書き込まれているのがわかります。

配列をシートに書き込んだ結果

以上が、

  1. シートから配列に読み込む
  2. 配列で処理をする
  3. 配列をシートに書き込む

という、一連の処理の簡単な説明となります。


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

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

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

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