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

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

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

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

Q&A

解決済

4回答

2169閲覧

Googleスプレッドシート(Google Apps Script)のsetValueをUndo履歴に登録したくない

koh1

総合スコア12

Google Apps Script

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

0グッド

0クリップ

投稿2019/08/08 08:34

#前提
Googleスプレッドシートで以下のような在庫管理表を運用しています。
物①~③までの物を、担当A~Cがそれぞれの「利用数」の行に必要数を入れることで確保する意味合いとし、残りがマイナスになるようなら相談をする、という運用をしています。

物①物②物③
担当A利用数1
担当B利用数2
担当C利用数11
在庫数433
利用数221
残り212

「利用数」の行はSUM関数を利用、「残り」の行は引き算で数を出しています。
しかし、各担当が利用数を全角数字で入力した場合、SUM関数の計算対象にならず、「利用数」「残り」の数が実態からずれてしまいます。

そこで、ネットの情報を参考にスクリプトエディタから以下のようなonEdit(e)関数を作成し、入力後に半角に自動で直すようにしました。

function onEdit(e) { var value = e.range.getValue().replace(/[0-9]/g, function(s) { return String.fromCharCode(s.charCodeAt(0) - 65248); }); e.range.setValue(value); }

#問題点
半角に直す処理は正常に動作するのですが、
ユーザーが全角数字を入力した後にUndo(Ctrl+Z)したとき、入力前の値に戻したいところ、全角→半角 の変換処理がUndoされ、全角に戻されてしまいます。
※その後、onEdit処理が再度動き、半角に直されます。

setValueで半角文字をセットした処理がUndoの履歴に登録されているのかと思いますが、この履歴を登録せず、Undo時にユーザー入力の前の値になるように 全角→半角 の変換処理を行いたいのですが、何か方法はありますでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

papinianusさんと同じく無理かと思いますので、
私なら入力規則で入力を半角英数のみにします。
やり方はリンク先参照してください。
https://qiita.com/Hiroyuki1993/items/07b71a161b68be447ea7

投稿2019/08/08 09:17

hiroshi0240

総合スコア640

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

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

koh1

2019/08/13 01:59

ありがとうございます。 エラーでユーザーの足止めをしたくない思いがあります。
guest

0

ベストアンサー

無理だろうという仮定での回答です

そこじゃなくてsumをオリジナル関数つくればよくないですか?

投稿2019/08/08 09:10

papinianus

総合スコア12705

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

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

papinianus

2019/08/08 09:31

そうか。これやっちゃうとundoで足し算の実行がundoされるから全然だめですね。
papinianus

2019/08/08 09:36

undoでonEditが動くという命題を検証したいな。ユーザ操作にあたるのかな。
hiroshi0240

2019/08/08 09:48

sumのオリジナル関数はundo関係なく関数としてセルに書けば使えるんじゃないでしょうか?
koh1

2019/08/13 01:58

ありがとうございます。 確かに履歴よりもまずカスタム関数を作る方に発想が行くべきでした。
papinianus

2019/08/13 08:05

わからないうちに解決してしまった。ごめんなさいテキトー回答で。
guest

0

以下の関数で合計算出すれば、タイムラグも出ないかと思います。

=sum(arrayformula(value(ASC(合計範囲))))

投稿2019/08/13 04:30

hiroshi0240

総合スコア640

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

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

koh1

2019/08/13 11:56

ありがとうございます。素晴らしいです。 すぐに反映されるので、こちらにするかもしれません。 (しかし既にベストアンサー付けてしまいました。すみません)
guest

0

カスタム関数の場合はUndoでユーザーの入力に戻せました。
ただ、処理に時間がかかり(Loading...が数秒表示される)、やはりやめることにしました。
全角で入力した場合はUndo一回では戻れないが仕方ないものとすることになりました。

投稿2019/08/13 02:05

koh1

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問