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

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

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

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

3871閲覧

GASで特定のセルが編集された時のみ、その隣のセルに編集ユーザー+日時を挿入したい

otaoma

総合スコア6

Google スプレッドシート

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

Google Apps Script

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

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

2クリップ

投稿2021/06/05 02:14

編集2021/06/05 02:52

前提・実現したいこと

当方、素人で勉強中の為、解決方法がわからず皆様にご教授をお願いいたします。
特定の列を編集した場合に限り、指定した行が編集された場合、その隣のセルに更新ユーザーおよび日時を挿入させたいと考えました。
サイトなどを参考に、ある程度形にはできたのですが、多少問題が発生し、無知すぎて解決できません…。
何が間違っているのか、教えていただければ幸いです。。。
一部コードに不明点などを記載してます。。。

発生している問題

■特定の列を編集した場合のみ反応してほしいが、全ての行編集に反応してしまい、特定列に限定する方法が思いつかない。
■何故か編集した下の行に挿入される。
■追記
複数シートで同様のことを実現したい場合、シート名を変更して同じコードを連続して書くしか方法はないでしょうか?
馬鹿な質問で申し訳ありません。。。

該当のソースコード

GAS
ソースコード
function test() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('***');//***は仮
var currentRow = sheet.getActiveCell().getRow();
if(currentRow>6){ 
sheet.getRange('BI' + currentRow) //上と合わせてBI6行以降から処理という解釈でまちがってませんか?
.setValue(
Utilities.formatDate(new Date(), 'JST', 'MM月dd日HH時mm分') + //日時フォーマット
' by ' + Session.getActiveUser().getEmail() //更新ユーザー
)
.setFontColor('red'); //文字色
}
}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/05 03:02 編集

「複数シートで同様のことを実現したい」とは、具体的にどのような意味なのでしょうか。 たとえばAシート、Bシート、Cシートの3つのシートがあって、 Aシートの変更はAシートのBI列に、 Bシートの変更はBシートのBI列に、 Cシートの変更はCシートのBI列に、 それぞれ変更時刻を記録したい、という理解でよろしいでしょうか。 それとも、A,B,Cシートそれぞれの変更を、別の記録用シート1枚に集約して記録したいということでしょうか?
otaoma

2021/06/05 03:58

回答ありがとうございます。 Aシートの変更はAシートのBI列に、 Bシートの変更はBシートのBI列に、 Cシートの変更はCシートのBI列に、 というご理解で間違いありません。 その場合、シート毎に同じコードを書き連ねるしかないのかと思いまして。。。
退会済みユーザー

退会済みユーザー

2021/06/05 04:04

ならば、 ss.getSheetByName('*')を ss.getActiveSheet()に変えればいいです。 (回答欄を修正しました)
otaoma

2021/06/05 04:41

あ、そうですね。 馬鹿な質問して申し訳ありません。。。 教えていただいたコードで編集してみます!!
guest

回答1

0

ベストアンサー

下記は、変更を検知する範囲を、B列からG列まで(かつ、6行目以降)に限定する例です。

fromCol(列の始点)とtoCol(列の終点)をあらかじめ定義しておき
if文を使って、編集したセルが指定した範囲内であるか判定し、
指定した範囲内であれば、編集したセルと同じ行のBI列に、変更時刻とユーザーを赤文字で書き込みます。

(*トリガーで、シートの編集時にtest()関数が実行されるように設定されているという前提です)

function test() { // 変更を検知するセル範囲を指定 var fromRow = 6; // 6行目から var fromCol = 2; // B列=2列目から var toCol = 7; // G列=7列目まで var ss = SpreadsheetApp.getActiveSpreadsheet(); //var sheet = ss.getSheetByName('*');//*は仮 var sheet = ss.getActiveSheet(); var currentRow = sheet.getActiveCell().getRow(); var currentCol = sheet.getActiveCell().getColumn(); // 編集したセルが指定したセル範囲内かどうか判定 if(currentRow >= fromRow && currentCol >= fromCol && currentCol <= toCol) {  // 指定したセル範囲内であれば、変更時刻とユーザーをBI列に書き込む sheet.getRange('BI' + currentRow) .setValue( Utilities.formatDate(new Date(), 'JST', 'MM月dd日HH時mm分') + //日時フォーマット ' by ' + Session.getActiveUser().getEmail() //更新ユーザー ) .setFontColor('red'); //文字色 } }

投稿2021/06/05 03:05

編集2021/06/05 04:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

otaoma

2021/06/05 07:00

解決することができました。 本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問