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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

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

Google Apps Script

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

Q&A

解決済

1回答

5990閲覧

スプレッドシートを更新したら自動で更新日付を入れるGAS

almond0782

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/03/23 02:35

前提

スプレッドシートで、B~O列にデータが更新されたら、A列に更新日が自動で入るというのをGASで行いたいと考えています。
データは複数行あり、毎日最後の行に追加されていくイメージです。

現状のソースコード

function inputDate() { var ss = SpreadsheetApp.getActiveSpreadsheet(); //現在触っているファイルを取得 var sheet = ss.getSheetByName('シート1'); //対象のシート名を選択 var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得 var currentCol = sheet.getActiveCell().getColumn(); //アクティブなセルの列番号を取得 var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得 var updateRange = sheet.getRange('A' + currentRow); //どの列に更新日時を挿入したいか。この場合はA列 Logger.log(updateRange); //更新日の記入 if(currentRow > 2 && currentCol == 2) { //2行目以降かつB列の変更を参照とする if(currentCell) { updateRange.setValue(new Date()); } } }

問題点

ネットで色々と調べていて、上記のソースコードまでは行き着き、トリガーの設定も済んでおります。
しかし上記のコードですと、データの貼り付けを行った行しか日付が更新されない状況です。

例えば、B2:O10のセルでデータが更新されても、貼り付けを行ったB2のみが対象となり、A2にのみ日付が更新されてしまいます。
これをA2:A10まで日付が更新されるように変更したいです。

データは基本的に複数行となるので修正したいと考えているのですが、イマイチわからないためご教示いただければ幸いです。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

複数セルを変更した場合でも発生するイベントは1つだけです。
イベント引数から編集された範囲を取得して、updateRangeを複数範囲にすればご要望どおりの動作になるはずです。

js

1function inputDate(e) { // イベント引数 e を追加 2 // 編集範囲はイベント引数から取得できます。 3 const range = e.range; 4 // シートは編集範囲経由で取得しました 5 const sheet = range.getSheet(); 6 if (sheet.getName() == 'シート1') { // 対象のシートかどうか判定します 7 const currentRow = range.getRow(); 8 const currentCol = range.getColumn(); 9 const currentNumRows = range.getNumRows(); // 行数も取得します。 10 if (currentRow > 1 && currentCol == 2) { // 2行目以降かつB列に変更があった場合に日付を更新する 11 const updateCells = sheet.getRange(currentRow, 1, currentNumRows); // 範囲に行数も指定することで複数行に対応 12 updateCells.setValue(new Date()); 13 } 14 } 15}

注意点

例示されたコードとは違い、値がない場合でも日付が更新されます。この動作では問題がある場合は編集範囲の行をforループで走査して値のある行だけ日付を書き込むように変更してください。

編集トリガーは一度に大量に発生すると一部が無視されるようです。1行づつ素早く値を入力していくような状況では日付が飛び飛びにしか入力されなかったのでご注意ください。
さらに選択範囲をCtrlなどを使って矩形以外の複雑な形(飛び地など)にした場合も編集範囲がうまく取得できません。

蛇足

関数名をinputDateからonEditにすることで、自分でトリガーを設定しなくてもイベントが発生するようになります。これらはシンプルトリガーと呼ばれています。今後GASでなにか作ることがあれば活用してみてください。

投稿2022/03/23 06:28

編集2022/03/23 06:33
miyaharu

総合スコア77

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

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

almond0782

2022/03/23 06:50

ご回答ありがとうございます。 いただいたコードを実行しましたが、以下のようなエラーが発生しました。 --- エラー TypeError: Cannot read property 'range' of undefined inputDate @ コード.gs:3 --- rangeが定義されていないというニュアンスのエラーだと思うのですが、 こちら事前になにか設定するものなどはございますか? またonEditについてもありがとうございます。 今後試してみます。 ご確認のほどよろしくお願いいたします。
miyaharu

2022/03/23 07:55

トリガーの設定でイベントの種類は編集時になっていますか? 変更時だった場合は編集時にしてみてください。
almond0782

2022/03/24 08:49

トリガーは編集時になっております。 他に考えられる原因はございますか?
miyaharu

2022/03/24 10:32

このコードはエディタにある「実行」ボタンで実行するとエラーになります。 トリガーから実行される分には問題ないはずですがいかがでしょうか。
almond0782

2022/03/25 01:22

確認不足ですいません、ありがとうございます。 できました!
miyaharu

2022/03/25 02:16

無事動いたようで良かったです。 こちらこそ説明不足な点が多く申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問