🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

11530閲覧

【GAS】特定のセルを編集した時のみonEditを有効にする方法

tsuneponn

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2020/06/02 15:39

前提・実現したいこと

・スプレッドシートの特定のシート(シート2)かつ特定のセル("B4"/プルダウン)の値を修正した時のみ同シート"N2"のセルに日付を自動入力
・スマホで操作してもトリガーが実行されるようにする

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

特定のシートに限定することはできましたが、さらに特定のセルに絞り込む方法が分かりません。

該当のソースコード

function onEdit(e) { if (e.range.getSheet().getSheetName() != "シート2") { return; } //現在時刻を取得 var now = new Date(); var year = now.getFullYear(); var month = now.getMonth()+1; var date = now.getDate(); //入力したい文字列に整形する var nowDate = year + "年" + month + "月" + date + "日" ; //特定のセルに時刻を入力// SpreadsheetApp.getActiveSheet().getRange("N2").setValue(nowDate); }

試したこと

日付入力ボタンとスクリプトの作成

補足情報(FW/ツールのバージョンなど)

環境:Macbook Air,Chrome(Chrome V8を無効にしています。)
2日前にプログラミングを勉強し始めました。至らない点も多くあるかと存じますが、どうかよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

e.range.getRow() で編集されたセルの行、e.range.getColumn() で列が取得できるので、

編集されたセルが 指定するシート名、指定の行、指定の列 に一致した時だけ 処理をする

としてあげれば希望する動きになります。
(AND条件は && を使います。ifの条件判定部分が長くなるので、先に変数の宣言をした方がよいです)

あと、現在のコードだと "シート2" ではない時は return で処理を終了という ifの使い方をしているので、上記のようにする場合は日付をセットするコードを ifの処理の中に入れる必要があります。

投稿2020/06/03 01:45

sawa

総合スコア3002

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

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

tsuneponn

2020/06/04 06:40 編集

ご回答ありがとうございます。 初歩的な話だとは思いますが、列や行の情報を取得するにはまず変数の宣言をする必要があるのですね。ちなみにifの判定部分が長いとその分処理に時間が掛かってしまうということでしょうか。高速化できるようであればアドバイス頂けると幸いです。コードは下に貼ります。 function onEdit(e) { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sheet = ss.getActiveSheet(); var range = sheet.getActiveRange(); var row = e.range.getRow(); var column = e.range.getColumn(); if (sheet.getName() == "シート2" && row == 4 && column == 2) { //現在時刻を取得 var now = new Date(); var year = now.getFullYear(); var month = now.getMonth()+1; var date = now.getDate(); //入力したい文字列に整形する var nowDate = year + "年" + month + "月" + date + "日" ; //特定のセルに時刻を入力// SpreadsheetApp.getActiveSheet().getRange("N2").setValue(nowDate); return; }}
sawa

2020/06/04 07:46

わかりやすくする為に変数の宣言した方がいいってだけで、必ず必要ではないです。 判定部分のコードの長さは処理時間には影響しないです。こちらも、見やすいかどう あと、このくらいの処理なら多少いじっても体感速度は変わらないと思います。 しいて上げれば、 var range = sheet.getActiveRange(); → 不要 var year = now.getFullYear(); var month = now.getMonth()+1; var date = now.getDate(); //入力したい文字列に整形する var nowDate = year + "年" + month + "月" + date + "日" ; → 単にセルに 日付を 年 月 日 で表示させるだけなら この部分も不要。 セルの書式設定で対応でよいのでは? //特定のセルに時刻を入力// SpreadsheetApp.getActiveSheet() → 冒頭で var sheet = ss.getActiveSheet(); と宣言してるんだから sheet を使いましょう
tsuneponn

2020/08/03 07:01

返信が遅くなり申し訳ございません。 処理速度を気にするのも大切ですが、スクリプトをスッキリさせるのもまた大切な技術ですね。 コメントありがとうございました。ぜひ参考にさせて頂き、スキルアップしていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問