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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

305閲覧

スプレッドシートで最新の日付を取得し、最新の日付が何行目にあるか見つける

mbcztpw

総合スコア30

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2023/05/18 13:07

スプレッドシートのA列で最新の日付を取得し、D列の何行目にあるか探します。
A列で最新の日付を取得し、D列で見つけ出すことができました。
ただ、A列をgetValues()で取得していて、D列をgetDisplayValues()でデータ取得していて
不統一なので、どちらかに統一してより効率的に取得する方法などがあるのではないかと思います。
もしあればご教示いただけないでしょうか。
よろしくお願いします。

GAS

1function myFunction() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet() 3 const st = ss.getSheetByName("sheet") 4 let data = st.getRange(1,1,st.getLastRow()).getValues().flat() 5 data = data.filter(v => v != "" && isDate(v)) 6 date = Math.max.apply(null,data) 7 date = Utilities.formatDate(new Date(date),"JST","yyyy/MM/dd") 8 let data1 = st.getRange(1,4,st.getLastRow()).getDisplayValues().flat() 9 10 let targetRow = data1.indexOf(date)+1 11 12 console.log(targetRow) 13 console.log(date) 14} 15 16function isDate(d) { 17 if ( Object.prototype.toString.call(d) == "[object Date]" ){ 18 return true; 19 } 20 return false; 21}

A列は日付のほか途中に空欄、文字の欄あり
D列は上から日付の欄のみ
イメージ説明

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

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

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

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

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

bebebe_

2023/05/19 05:22

「getValues」でDate型で取得して比較等する場合に「getTime()」で得られた値を使うのはどうでしょうか
YellowGreen

2023/05/19 08:33

回答ではありませんのでコメントで。 私はどちらかというとgetValuesもgetDisplayValuesも目的に適した方を使えば良くて、どちらかに統一したいとは思わないです。パフォーマンス的にも今のロジックでいいかと。 それよりも、isDateで条件がtrueのときにtrueを返して条件がfalseのときにfalseを返しているのが重複しているようで気になります。 そのまま return Object.prototype.toString.call(d) == "[object Date]"; としたくなります。
guest

回答1

0

それぞれの方法で取得し、比較すると例えば次のようになるでしょうか。

繰り返し処理を入れてそれぞれ実行時間を計測して比べてみましたが、
そもそも、処理の手法に大きな違いがないせいか、
サーバーの負荷(?)による変動の方が大きくて
3つに明らかな差はありませんでした。

js

1//日付と文字列それぞれに取得し文字列として比較 2function myFunction0() { 3 const ss = SpreadsheetApp.getActiveSpreadsheet(); 4 const st = ss.getSheetByName('sheet'); 5 const data = st.getRange(1, 1, st.getLastRow()).getValues() 6 .flat().filter(v => v && isDate(v)); 7 let date = Math.max.apply(null, data); 8 date = Utilities.formatDate(new Date(date), 'JST', 'yyyy/MM/dd'); 9 const data1 = st.getRange(1, 4, st.getLastRow()).getDisplayValues().flat(); 10 const targetRow = data1.indexOf(date) + 1; 11 console.log(targetRow); 12 console.log(date); 13} 14//どちらも日付として取得し数値(経過ミリ秒)として比較 15function myFunction1() { 16 const ss = SpreadsheetApp.getActiveSpreadsheet(); 17 const st = ss.getSheetByName('sheet'); 18 const data = st.getRange(1, 1, st.getLastRow()).getValues() 19 .flat().filter(v => v && isDate(v)); 20 const date = Math.max.apply(null, data); 21 const data1 = st.getRange(1, 4, st.getLastRow()).getValues() 22 .flat().filter(v => v).map(v => v.getTime()); 23 const targetRow = data1.indexOf(date) + 1; 24 console.log(targetRow); 25 console.log(Utilities.formatDate(new Date(date), 'JST', 'yyyy/MM/dd')); 26} 27//どちらも文字列として取得し文字列として比較 28function myFunction2() { 29 const ss = SpreadsheetApp.getActiveSpreadsheet(); 30 const st = ss.getSheetByName('sheet'); 31 const data = st.getRange(1, 1, st.getLastRow()).getDisplayValues() 32 .flat().filter(v => v && isDateStr(v)); 33 const date = data.sort()[data.length - 1]; 34 const data1 = st.getRange(1, 4, st.getLastRow()).getDisplayValues().flat(); 35 const targetRow = data1.indexOf(date) + 1; 36 console.log(targetRow); 37 console.log(date); 38} 39function isDate(d) { 40 return Object.prototype.toString.call(d) == "[object Date]"; 41} 42function isDateStr(s) { 43 return s.match(/^[0-9]{4}\/(0[1-9]|1[0-2])\/(0[1-9]|[12][0-9]|3[01])$/); 44}

投稿2023/08/20 07:38

編集2023/08/20 07:57
codemaker

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問