質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

421閲覧

GAS 外部機器からステータス(open/close)を取得し、 openとなった時刻をスプレッドシートに記録したい

yuka_id

総合スコア8

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/09/06 12:17

前提

GASで外部扉センサーからステータス(open/close)を取得し、
openステータスとなった時刻をスプレッドシートに記録をしたいと考えています。
センサーのステータスはGAS側から取得しにいく必要があります。

ステータスは基本的にはcloseで、openになった場合、その状態は10分程度持続します。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • GASで外部扉センサーからステータス(open/close)をリアルタイムで取得する(できた)
  • closeの場合→何もしない openの場合→スプレッドシートに時刻を記録する(できた)
  • openの状態は10分程度持続するが、最初に開いたタイミングのみ記録したい(できていない)

発生している問題・エラーメッセージ

センサーのステータスはGAS側から取得しにいく必要があるため、
トリガーを1分毎で設定し、上記実装しようとしたのですが、
open状態の10分間、毎分記録がされてしまいました…。

試したこと

①1分毎実行のトリガーでopen/closeのステータスを取得し、結果をスプレッドシートに反映する一つ目のスクリプトを作成
②上記スプレッドシートに編集が加えられた場合を実行トリガーに設定した、時刻を記録する二つ目のスクリプトを作成

という方法を試してみましたが、「スプレッドシートに編集が加えられた場合」というのが、
手動で書き加えた場合のみ反映される?ようで、上手く実行できませんでした。

その他に、考え方としては

・時刻を記録したら、トリガーを一定時間停止する
・ステータスがclose⇒openになったタイミングだけ記録し、open⇒openでは何もしない
・トリガー設定をGASの設定ではなく記述で詳細に管理する

など、、なんとなく思い付きはするのですが、実現可能か分かりません。

ヒントだけでも構いませんので、
この状況を解決する方法が分かる方がいらっしゃいましたら
ご教示いただけますと大変ありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2022/09/06 13:04

取得した値をスプレッドシートのどこかに書いておいて 取得したときに比べればいいのではないですか?
guest

回答1

0

ベストアンサー

※ GASから1分ごとに扉の状態を取得するとのことですが、隣接するステータス取得タイミングで扉の状態が変わらないような開け閉め動作(GASの次の取得前に、閉じている状態から開けて閉める。もしくは開いている状態から閉めてまた開ける、というような動作)が行われた場合は、状態変化が起きていないものとみなす、という暗黙の前提があるとします。

・ステータスがclose⇒openになったタイミングだけ記録し、open⇒openでは何もしない

まさにこれをコード化すればよいだけではないでしょうか?
状態を記録するスプレッドシートのセルを「状態記録セル」、"最初にopenになったことを確認できた時刻"を記録していく列を「履歴列」と呼称することとします。
つまり、1分ごとにセンサーを確認するとして:
・センサーを確認したときにclose状態だったとき
→「CLOSE」という文字列を状態記録セルに記録します。

・センサーを確認したときにopen状態だったとき
まず、状態記録セルを読み取ります。そして
IF 状態記録セルが「CLOSE」であった場合→状態記録セルに「OPEN」を記録し、履歴列の次の空白行に現在時刻を記録します。
ELSE 状態記録セルが「OPEN」だった場合(「CLOSE」という文字列ではなかった場合) → 何もしません。

質問文によれば扉はつねに「10分程度開く」とのことです。
つまり「10分程度」経過すれば自動で閉じるということでしょう。
これを前提とした場合、扉が開いている10分間のうち最初のタイミングであることを確認できた時刻を記録するには「確認時のステータスがopenであり、かつ前回の確認時はclose状態であった、と判定できるタイミング」で、その時刻を記録すれば十分です。

上記のようにすれば、要件を満たす(履歴列に”最初にOPENとなったことが確認できた時刻"だけが連綿と記録される)のではないでしょうか。

投稿2022/09/06 13:32

編集2022/09/06 14:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuka_id

2022/09/17 14:40

お礼が遅くなり大変申し訳ございません! ご教示いただいた内容を参考に、やりたいことを実現することができました!!! 誠にありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問