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

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

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

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

Q&A

解決済

3回答

853閲覧

右端に1が入力されたら行替えして0を入力する作業を自動化したい。

koromo_t

総合スコア60

Google Apps Script

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

0グッド

0クリップ

投稿2018/03/26 02:17

編集2018/03/27 00:22

||A|B|C|D|
|:--|:--:|--:|
|1|…|…|…|1|
|2|0|…|1||
|3|0||
|4|||

A1から右に向かってデータを入力していきます。
行の右端に1が入力されたら、行をかえて0が入力される、ということがしたいです。
したいのですが、これをやろうとすると、どうしても循環参照になってしまいますよね…。
この作業は手動でもそれほど大変なことではないので、手動でもいいかなとも思うのですが、
でも、なんか自動化できそうな気もするので、こちらで尋ねてから判断しようと思いました。
可能でしたら、アイデアをいただけると嬉しいです。

追記(現状)

右端の値は=INDEX(B2:K2,MATCH(MAX(B2:K2)+1,B2:K2,1)で取得できるとあったので、これを使って、=IF(INDEX(B2:K2,MATCH(MAX(B2:K2)+1,B2:K2,1))=1,B3=0,INDEX(B2:K2,MATCH(MAX(B2:K2)+1,B2:K2,1)))
みたいなことまでは考えました。B3というのは、行を変えた先を想定しています。

追記2

先に書かないといけなかったのですが、忘れていたので追記します。
Excelのタグを付けていますが、当方スプレッドシートを使っています。

~解決後のまとめ~

ttyp03さんの回答を参考に解決しましたので、まとめておきます!


「GAS スプレッドシート 1が入力されたら」で検索したところ、
参考になりそうな記事を見つけまして(下記参照)、
それをカスタマイズ?してみたところ、ななんと、うまくいきました。
なので、ご報告に上がりました。

もうひとつ、別のスクリプトから、
「右隣にアクティブセルを移動する」という要素もお借りして、

「変更のあったセルの値が1だったときに、
変更のあったセルのある行の1行下の2列目のセルに0を入力し、
右隣のセルにアクティブセルを移動。」
という内容にしてみました。

完成形

javaScript

1// シートに変更があった時に実行する関数 2function onEditEvent() { 3 // 変更のあったシート 4 var ss = SpreadsheetApp.getActiveSpreadsheet(); 5 var sh = ss.getActiveSheet(); 6 // 変更のあったセル 7 var cell = ss.getActiveRange(); 8 // 変更のあったセルの値 9 var val = cell.getValue(); 10 // 変更のあったセルの値が1だった時に 11 if( ( val == 1 ) ) { 12 // 変更のあったセルの有る行番号 13 var r = cell.getRow(); 14 // 変更のあったセルの有る行の下の行の2列目を選択 15 var rowRange = sh.getRange(r+1, 2); 16 rowRange.setValue(0).offset(0, 1).activate() ; 17 } 18}

【ありがたい参考記事】

https://teratail.com/questions/118993
当記事です。希望を実現するにはスクリプトが必要ということがわかりました。
http://chaika.hatenablog.com/entry/2015/09/03/143622
セルに特定の値を入力したら処理を行う方法を参考にしました。
スクリプトのベースはこちらの方のもの。
http://www.relief.jp/docs/google-spreadsheet-gas-offset.html
アクティブセルを隣に移動する方法を参考にしました。

これまで、解決した際、参考記事のことについては書いていなかったのですが、
自分のためにもみんなのためにも書くべきかもしれないと思ったので、
これからは可能な限り書いていこうと思いました。
これまでした質問についても、ちょっと遡って、参考記事を追記してみようと思います。
ただ、どこまで追えるかわかりませんが…。

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

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

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

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

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

sazi

2018/03/26 02:27

行の右端というのはどのような判定にしているのでしょう?次の行の値を変更するのだから循環参照にはならないと思うので、現状でやっていること(式など)を質問に追加されて下さい。
guest

回答3

0

#~解決後のまとめ~
ttyp03さんの回答を参考に解決しましたので、まとめておきます!


「GAS スプレッドシート 1が入力されたら」で検索したところ、
参考になりそうな記事を見つけまして(下記参照)、
それをカスタマイズ?してみたところ、ななんと、うまくいきました。
なので、ご報告に上がりました。

もうひとつ、別のスクリプトから、
「右隣にアクティブセルを移動する」という要素もお借りして、

「変更のあったセルの値が1だったときに、
変更のあったセルのある行の1行下の2列目のセルに0を入力し、
右隣のセルにアクティブセルを移動。」
という内容にしてみました。

完成形

javaScript

1// シートに変更があった時に実行する関数 2function onEditEvent() { 3 // 変更のあったシート 4 var ss = SpreadsheetApp.getActiveSpreadsheet(); 5 var sh = ss.getActiveSheet(); 6 // 変更のあったセル 7 var cell = ss.getActiveRange(); 8 // 変更のあったセルの値 9 var val = cell.getValue(); 10 // 変更のあったセルの値が1だった時に 11 if( ( val == 1 ) ) { 12 // 変更のあったセルの有る行番号 13 var r = cell.getRow(); 14 // 変更のあったセルの有る行の下の行の2列目を選択 15 var rowRange = sh.getRange(r+1, 2); 16 rowRange.setValue(0).offset(0, 1).activate() ; 17 } 18}

【ありがたい参考記事】

https://teratail.com/questions/118993
当記事です。希望を実現するにはスクリプトが必要ということがわかりました。
http://chaika.hatenablog.com/entry/2015/09/03/143622
セルに特定の値を入力したら処理を行う方法を参考にしました。
スクリプトのベースはこちらの方のもの。
http://www.relief.jp/docs/google-spreadsheet-gas-offset.html
アクティブセルを隣に移動する方法を参考にしました。

これまで、解決した際、参考記事のことについては書いていなかったのですが、
自分のためにもみんなのためにも書くべきかもしれないと思ったので、
これからは可能な限り書いていこうと思いました。
これまでした質問についても、ちょっと遡って、参考記事を追記してみようと思います。
ただ、どこまで追えるかわかりませんが…。

投稿2018/03/26 21:38

編集2018/03/27 04:55
koromo_t

総合スコア60

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

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

0

ベストアンサー

セルに入力する数式では実現できません。
マクロを使うことで対応可能と思います。
簡単に書くとこんな感じです。

VBA

1Private Sub Worksheet_Change(ByVal Target As Range) 2 If Target.Value = 1 Then 3 Cells(Target.Row + 1, 1).Value = 0 4 Cells(Target.Row + 1, 2).Select 5 End If 6End Sub

投稿2018/03/26 03:01

ttyp03

総合スコア16998

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

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

koromo_t

2018/03/26 03:16

回答ありがとうございます! なるほど、マクロですか…。 となると、スプレッドシートにおいてはGASを使うということになるのですね。 でも、なんとなく答えに手が届きそうな雰囲気を感じます。 とりあえず、質問にGASのタグも追加しました。
Zuishin

2018/03/26 03:24

追加ではなく Excel を外してください。
koromo_t

2018/03/26 03:25

あ、そうですね、すみません…。
ttyp03

2018/03/26 05:07

Excelではないのですね。失礼しました。 GASでも確か同じようなことはできたと思うので、参考にしてみてください。
koromo_t

2018/03/26 19:35 編集

いえ、こちらこそ、質問文に書き忘れたのがいけなかったので…。 スプレッドシートのタグがあればそちらを使いたいのですが、なさそうなんですよね…。 せっかく考えてくださったのに、ごめんなさい。 でも「スクリプトで動かす」という答えが参考になりました! なので、ベストアンサーにさせていただきます! これから、ちょっと研究をしてみようと思います。 回答ありがとうございます! あと‥質問には関係ないことですが…、 ttyp03さんのアイコン画像は‥鳥をしつけしている様‥ですか…? いや、ちょっと興味がわいたもので…w
guest

0

セルの値が変更されたら
値が1&そのセルの行のそのセルの列以降に値がない場合
次行の最初のセルの値を0に

イベントプロシージャ


追記

GoogleSpredSheetならこれ

ScriptApp

まず任意の関数のTriggerBuilderオブジェクトを作って
そいつからSpreadsheetTriggerBuilderオブジェクトを作って
そっからさらにonEditのSpreadsheetTriggerBuilderオブジェクトを作って
そいつからTriggerオブジェクトを作ることでイベントリスナー追加完了
という流れらしいです

SpreadsheetTriggerBuilderのとこは
onEditのSpreadsheetTriggerBuilderにする
という処理なのかな?

新しいインスタンスが作られてるのか
自身を変更して返してるのかどっちか不明…
要確認

投稿2018/03/26 02:41

編集2018/03/27 02:02
KazuhiroHatano

総合スコア7804

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

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

koromo_t

2018/03/26 02:57

回答ありがとうございます! イベントプロシージャとは初めて知ったものですが、 これを使うとドンピシャなことができるみたいですね。 ただ、使い方がわからないので、研究の必要がありそうですが…。 そして、質問文に書き忘れたのがいけないのですが、 当方、Excelではなくスプレッドシートを使用しているので、 おそらくこのイベントプロシージャとやらは使うことができない‥のではないかと考えました。
koromo_t

2018/03/26 19:38 編集

追記部分読みました。 回答ありがとうございます! ほう…、なんだか難しそうですね…? 私にはちょっと理解できそうにありませんが…、 考えてくださってありがとうございます! あと‥、回答者さんの回答だけ、書式?が なんだかおかしなことになっているような気がするのですが、 タグの閉じ忘れとか、なにか思い当たることはありませんか?
KazuhiroHatano

2018/03/27 02:14

なんか要素詳細見るとVBAのコードってことにされちゃってるっぽいですね 上の回答のvba部分でteratailのマークダウンの処理ミスしてるような気がします どうもteratailのコードのマークダウンは挙動が不安定な気がします インラインのコード記述とブロックのコード記述が同居したときとかうまく動かないんですよね
koromo_t

2018/03/27 04:45

!! 上の方の回答が原因とは盲点であり、 こちらが原因だと思い込んでしまっていました、すみません…! なるほど、そういうことがあるのですね…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問