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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1334閲覧

Googleスプレッドシートの同じシート上でセルごとに異なるルールでタイムスタンプを付けたい

fbps

総合スコア3

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/12/14 10:32

前提・実現したいこと

当方初心者です。
Googleスプレッドシートの業務実施報告書でタイムスタンプをつける様式を作成したいと考えています。

【プルダウンリストから選択してテキストが表示されたら右隣のセルにタイムスタンプを表示する】
というスクリプトをこちらで教わりながら作成したのですが、同じシート上の別なセルに、

【プルダウンリストから選択してテキストが表示されたら「その真下のセル」にタイムスタンプを表示させる】
という処理も同じシートで行いたいのです。具体的には


①「(E25:E32)セルに入力したら、(F25:F32)セルにタイムスタンプを表示する」(ここまでできています)
②「(C37:G37)(C42:G42)(C51:H51)… セルに入力したら、(C38:G38)(C43:G43)(C52:H52)… にタイムスタンプを表示する」(ここがどうにもできずに困っています。。。)


どなたかお知恵をお借りしたくお願いいたします。

該当のソースコード

function onEdit(e) {

//操作されたセルの情報 シート名、行、列を取得
var sheet = e.range.getSheet().getSheetName();
var r = e.range.getRow();
var c = e.range.getColumn();

var targetSheets = ["1","2","3"] //実行したいシートを選択
if(targetSheets.includes(sheet)){
}else{
return
}

if(c != 5 | r >=33 | r <=24 ) return; 
// e列(5列目)以外と、24行目以前と33行以降を除外

if(!e.value | e.value == 'FALSE'){
e.range.getSheet().getRange(r, c+1).clearContent(); 
// チェックを外したり空欄とした際に日時を消去
return;
}
e.range.getSheet().getRange(r, c+1).setValue(new Date());
//シート側で表示設定を日時とする

}

試したこと

発動させたい範囲だけを(e25:e32)のように指定するようにしたくて色々してみましたがうまく反応しませんでした。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1const onEdit = (e) => { 2 const targetSheets = ["1","2","3"]; 3 const directions = [["E25:E32",0,1],["C37:G37",1,0],["C42:G42",1,0]]; 4 5 const curRange = e.range; 6 const sheet = curRange.getSheet(); 7 const sheetName = sheet.getSheetName(); 8 if(!targetSheets.includes(sheetName)) return; 9 const value = (e.value && e.value !== 'FALSE') ? new Date() : ""; 10 const r = curRange.getRow(); 11 const c = curRange.getColumn(); 12 directions.filter(e=> isRangeIncludes(sheet, e[0], r, c)).forEach(f=>curRange.offset(f[1],f[2]).setValue(value)); 13} 14const isRangeIncludes = (sheet, R1C1, r, c) => { 15 const range = sheet.getRange(R1C1); 16 const rangeT = range.getRow(); 17 if(r < rangeT) return false; 18 const rangeL = range.getColumn(); 19 if(c < rangeL) return false; 20 const rangeB = rangeT + range.getNumRows() - 1; 21 if(r > rangeB) return false; 22 const rangeR = rangeL + range.getNumColumns() - 1; 23 if(c > rangeR) return false; 24 return true; 25}

投稿2020/12/14 13:50

papinianus

総合スコア12705

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

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

fbps

2020/12/15 01:29

ご回答ありがとうございます! いただいたコードに書き換えて、必要なセルの範囲を追加したところ希望している挙動になりました! 書いてある内容をゆっくりひとつずつ理解して勉強させていただきます。 大変助かりまたためになる内容ご教授下さり感謝いたします。 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問