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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

2677閲覧

GAS Googleスプレッドシートの特定のシートに変更があった場合に、特定のセルに更新日時を自動反映させたい

misoji-o-ji

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/03/24 09:04

前提・実現したいこと

Google Apps Scriptを勉強中の者です。
Googleスプレッドシートを複数名で共有して在庫の管理などを行っているのですが、
最後に更新した日時が変更履歴を参照しなくても、スプレッドシート上に表示されるようにしたいと思い、
ネット上のコードを参考にして下記のようなコードを作成しました。

【コード】
function onEdit(e){

//今変更されたシート名を取得
var edit_sheet_name = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetName();
Logger.log(edit_sheet_name);

switch (edit_sheet_name){
case 'シート1':
onEdit1();
break;

case 'シート2': onEdit2(); break;

}
}

// シートに変更があった時に実行する関数
function onEdit1() {
// 変更のあったシート
var ss = SpreadsheetApp.getActive().getSheetByName("シート1");
var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得
var currentCol = sheet.getActiveCell().getColumn(); //アクティブなセルの列番号を取得
var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得
var updateRange = sheet.getRange('O' + currentRow); //どの列に更新日時を挿入したいか。
Logger.log(updateRange); //更新日の記入
if(currentRow > 1 && currentCol < 14) { //A列目~M列目までの変更を参照とする
if(currentCell) {
updateRange.setValue(new Date());
}
}
}

function onEdit2() {
// 変更のあったシート
var ss = SpreadsheetApp.getActive().getSheetByName("シート2");
var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得
var currentCol = sheet.getActiveCell().getColumn(); //アクティブなセルの列番号を取得
var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得
var updateRange = sheet.getRange('O' + currentRow); //どの列に更新日時を挿入したいか。
Logger.log(updateRange); //更新日の記入
if(currentRow > 1 && currentCol < 14) { //A列目~M列目までの変更を参照とする
if(currentCell) {
updateRange.setValue(new Date());
}
}
}

【実現希望機能】
■特定のシートに関して、何らかの変更があった場合に指定のセルに更新日時を自動で入力
・特定のシート⇒「シート1」、「シート2」
・変更を読み取る範囲⇒上記各シートのA列からM列の範囲
・更新日時を入力するセル⇒変更のあったセルと同じ行のO列

参考にしたコードを自分なりに組み替えて作成したので、文法等に間違いがあるようで
思った通りの結果が返ってきません。
どうすればうまく動作するでしょうか?

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

17:21:43 情報 シート1 17:21:44 エラー ReferenceError: sheet is not defined onEdit1 @ 無題.gs:23 onEdit @ 無題.gs:9 ### 該当のソースコード

Google

1function onEdit(e){ 2 3 //今変更されたシート名を取得 4 var edit_sheet_name = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetName(); 5 Logger.log(edit_sheet_name); 6 7 switch (edit_sheet_name){ 8 case 'シート1': 9 onEdit1(); 10 break; 11 12 case 'シート2': 13 onEdit2(); 14 break; 15 16 } 17} 18 19// シートに変更があった時に実行する関数 20function onEdit1() { 21 // 変更のあったシート 22 var ss = SpreadsheetApp.getActive().getSheetByName("シート1"); 23 var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得 24 var currentCol = sheet.getActiveCell().getColumn(); //アクティブなセルの列番号を取得 25 var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得 26 var updateRange = sheet.getRange('O' + currentRow); //どの列に更新日時を挿入したいか。 27 Logger.log(updateRange); //更新日の記入 28 if(currentRow > 1 && currentCol < 14) { //A列目~M列目までの変更を参照とする 29 if(currentCell) { 30 updateRange.setValue(new Date()); 31 } 32 } 33} 34 35 36function onEdit2() { 37 // 変更のあったシート 38 var ss = SpreadsheetApp.getActive().getSheetByName("シート2"); 39 var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得 40 var currentCol = sheet.getActiveCell().getColumn(); //アクティブなセルの列番号を取得 41 var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得 42 var updateRange = sheet.getRange('O' + currentRow); //どの列に更新日時を挿入したいか。 43 Logger.log(updateRange); //更新日の記入 44 if(currentRow > 1 && currentCol < 14) { //A列目~M列目までの変更を参照とする 45 if(currentCell) { 46 updateRange.setValue(new Date()); 47 } 48 } 49}

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

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

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

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

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

guest

回答1

0

ベストアンサー

プログラムの細部は見ていませんが、エラー内容から見て「sheet」変数が宣言されずに使用されているのが原因かと思われます。

var ss = SpreadsheetApp.getActive().getSheetByName("シート名");
としてシート情報を取ってきているのであれば、それ以降の部分は「ss」を使うようにするか

var sheet = SpreadsheetApp.getActive().getSheetByName("シート名");
としてみてはいかがでしょうか。

投稿2021/03/26 03:34

mkk

総合スコア378

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

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

misoji-o-ji

2021/03/27 14:29

ご回答ありがとうございます。 またご返事が遅くなってしまい申し訳ございません。 おっしゃる通り変数の宣言が間違っていました。 ネット上のコードを参考にする際に、統一出来ていなかったようです。 根本的なところの理解が乏しいので、ミスにも気づけないのがお恥ずかしいです。 しっかりと基本から復習したいと思います。 無事ご教授頂いた通り修正しましたところ、下記のコードで「シート1」「シート2」 共にセルの変更があった行のO列に更新日時が自動で反映されるようになりました。 本当にありがとうございました。 【修正後コード】 function onEdit(e){ //今変更されたシート名を取得 var edit_sheet_name = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getSheetName(); Logger.log(edit_sheet_name); switch (edit_sheet_name){ case 'シート1': onEdit1(); break; case 'シート2': onEdit2(); break; } } // シートに変更があった時に実行する関数 function onEdit1() { // 変更のあったシート var sheet = SpreadsheetApp.getActive().getSheetByName("シート1"); var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得 var currentCol = sheet.getActiveCell().getColumn(); //アクティブなセルの列番号を取得 var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得 var updateRange = sheet.getRange('O' + currentRow); //どの列に更新日時を挿入したいか。 Logger.log(updateRange); //更新日の記入 if(currentRow > 1 && currentCol < 14) { //A列目~M列目までの変更を参照とする if(currentCell) { updateRange.setValue(new Date()); } } } function onEdit2() { // 変更のあったシート var sheet = SpreadsheetApp.getActive().getSheetByName("シート2"); var currentRow = sheet.getActiveCell().getRow(); //アクティブなセルの行番号を取得 var currentCol = sheet.getActiveCell().getColumn(); //アクティブなセルの列番号を取得 var currentCell = sheet.getActiveCell().getValue(); //アクティブなセルの入力値を取得 var updateRange = sheet.getRange('O' + currentRow); //どの列に更新日時を挿入したいか。 Logger.log(updateRange); //更新日の記入 if(currentRow > 1 && currentCol < 14) { //A列目~M列目までの変更を参照とする if(currentCell) { updateRange.setValue(new Date()); } } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問