スプレッドシートの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}
「getValues」でDate型で取得して比較等する場合に「getTime()」で得られた値を使うのはどうでしょうか
回答ではありませんのでコメントで。
私はどちらかというとgetValuesもgetDisplayValuesも目的に適した方を使えば良くて、どちらかに統一したいとは思わないです。パフォーマンス的にも今のロジックでいいかと。
それよりも、isDateで条件がtrueのときにtrueを返して条件がfalseのときにfalseを返しているのが重複しているようで気になります。
そのまま
return Object.prototype.toString.call(d) == "[object Date]";
としたくなります。
