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

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

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

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

Q&A

解決済

1回答

2173閲覧

コピペで更新したら、onEditが動かない

shimamaru

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2022/06/10 07:12

こんにちは。先週からはじめてのプログラミングを勉強中です。
手始めに研修管理シートを作成していますが、下記がうまくいきません。

【やりたいこと】
スプレッドシートの「受講予定者一覧」というシートに、研修を受ける必要のある人の名簿が記録されています。
このシートのF列に、研修の受講状況(受講済,未受講)を記録していきます。

このF列の値が「受講済」に更新された場合、
・更新されたセルの右隣のセル(G列)に、「受講済」へと更新した日時を、
・更新されたセルの2つ右のセル(H列)に、更新した人のメールアドレスを
それぞれ取得して記録したいです。

F列を更新する際に、一つ一つのセルに「受講済」と入力していけば、書いてみたコードはうまく動くのですが、「受講済」の値をどこかのセルからコピーしてきて、まとめて更新した場合、どちらの操作も動きません。
F列の更新をひとつひとつした場合だけでなく、コピペでまとめて更新した場合にも動作するようにはできないのでしょうか。

書いたコードはこちらです。

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();
var ssName = sheet.getSheetName();
var cellvalue = e.value;
var oldcellvalue = e.oldValue;

console.log('onEdit');
console.log('ssName:' + ssName);
console.log('row:' + row);
console.log('column:' + column);
console.log('cellvalue:' + cellvalue);
console.log('oldcellvalue:' + oldcellvalue);

if(ssName != '受講予定者一覧') return;

// 「受講予定者一覧」シートで処理する内容
if (column == 6 && cellvalue == '受講済' && oldcellvalue == '未受講') {
console.log('before xxx');
var str = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd HH:mm:ss");
var user = Session.getActiveUser().getUserLoginId();

console.log('str:' + str); console.log('user:' + user); sheet.getRange(row,7).setValue(str); sheet.getRange(row,8).setValue(user);

}

}

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

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

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

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

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

shimamaru

2022/06/10 07:14

すみません。なんか変なところでコードが切れてしまっています。
guest

回答1

0

ベストアンサー

gs

1function onEdit(e) { 2 3 var ss = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheet = ss.getActiveSheet(); 5 6 var range = sheet.getActiveRange(); 7 var row = e.range.getRow(); 8 var column = e.range.getColumn(); 9 var ssName = sheet.getSheetName(); 10 var cellvalue = e.value; 11 var oldcellvalue = e.oldValue; 12 13 if (ssName != '受講予定者一覧') return; 14 15 // 複数セルを編集した場合「F2:F4」と取れるので、「:」で区切り、配列化 16 let ranges = range.getA1Notation().split(":") 17 18 // 配列の長さが2なら、複数セルの編集処理 19 if (ranges.length == 2) { 20 // 開始セル行と終了セル行 21 let startNum = ranges[0].replace(/[A-Z]/, "") 22 let endNum = ranges[1].replace(/[A-Z]/, "") 23 // 入力した複数セルの値を配列化 24 let rangesValues = range.getValues().flat() 25 26 // 入力はF列か 27 if (column == 6) { 28 // 開始セル行から終了セル行まで繰り返す 29 for (let i = startNum, j = 0; i <= endNum; i++, j++) { 30 if (rangesValues[j] == '受講済') { 31 let str = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd HH:mm:ss"); 32 let user = Session.getActiveUser().getUserLoginId(); 33 34 sheet.getRange(i, 7).setValue(str) 35 sheet.getRange(i, 8).setValue(user) 36 } 37 } 38 } 39 } 40 41 // 「受講予定者一覧」シートで処理する内容 42 if (column == 6 && cellvalue == '受講済' && oldcellvalue == '未受講') { 43 console.log('before xxx'); 44 var str = Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd HH:mm:ss"); 45 var user = Session.getActiveUser().getUserLoginId(); 46 47 console.log('str:' + str); 48 console.log('user:' + user); 49 50 sheet.getRange(row, 7).setValue(str); 51 sheet.getRange(row, 8).setValue(user); 52 } 53 54}

このような感じでどうでしょうか?
複数セル入力した場合、繰り返し処理を用いて値を設定させれば、実現可能ではないかと思います。

投稿2022/06/10 13:08

k.a_teratail

総合スコア845

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

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

shimamaru

2022/06/17 05:11

ご回答ありがとうございます!いろいろやっていてお返事が遅れてしまいましたが、理想の操作ができるようになりました!うれしいです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問