どうでもいいプログラム研究所

とある編集者によるIT、Web、ソフトウェア、プログラミングに関する雑記と覚え書き

Google Apps Scriptで今日の日付の行に一瞬で移動する方法

f:id:tdyu5021:20190504132834p:plain

Googleスプレッドシートは前回閉じた場所を記憶できない!

スケジュール表をExcelなどのスプレッドシートを使って作るという行為は、おそらくビジネスマンなら大半の人が体験しているはずです。編集・制作の仕事をしている私も日常茶飯事です。前はExcelをよく使っていましたが、最近ではGoogle スプレッドシートを使い始めました。

ただ、すぐにこれには問題があることに気がつきました。行を使って縦方向に日付を記入するスケジュール表の場合、スケジュール期間が短ければよいのですが、「年間予定」のようなかなり期間の長いと問題が発生します。

というのも、Excelと違ってGoogleスプレッドシートはワークシート上の最後に閉じた場所を記憶するわけではないので、ファイルを開いたら必ず先頭の行列(A1)が画面の一番上に来た状態で表示されます。

ですから、確認したいスケジュールの場所がそれよりも何十行も先の行にあるとわざわざ開くたびにそこまでスクロールしなければいけません。

本日の日付が書いてある行を見つけてそこをアクティブにしてみる

そこで私が考えたのがスプレッドシートを開いたときに今日の日付の行に自動で飛んでくれればよいのでは・・」という解決策です。

(まぁそんなことをせずとも、過ぎた日付の行を非表示にするとかいう運用をすれば完全に解決するのですけど・・)

そんなそもそも論はさておき、A列にある日付の羅列のうち、本日の日付を見つけ、そのセルをアクティブにするというスクリプトを作ってみました。

function myFunction() {
   var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
   var d = new Date();
   var today = Utilities.formatDate(d, "JST","M月dd日"); 
   var foundRow = findRow(sh,today,1);
   var todayCell = sh.getRange(foundRow,1);
   sh.setActiveRange(todayCell); 
}
function findRow(sheet,val,col){
   var dat = sheet.getDataRange().getValues();
   for(var i=1;i < dat.length;i++){
      try{var target = Utilities.formatDate(dat[i][col-1], "JST","M月dd日");
   }catch(e){}
   if(target === val){
      return i+1;
      break;
   }
}
return 0;
}

このコードだけではまだ手動実行になります。上記のコードにあるmyFunctionという関数をonOpenにすれば、スプレッドシートを開くのと同時にこれが実行されるはずです(まだ検証してません)。

上記のコードは細かく説明しませんが、

(1)本日の日付をM月dd日形式にして変数に格納

(2)A列の日付すべてを配列に格納

(3)(2)の配列の中から本日の日付に合致するものを検索する

(4)見つかった行数のセルをアクティブにする

やっているのは上記だけのことです。

ちなみに特定行の中から該当する行を取得する関数(上記コード中のfindRow)については、偉大なるタカハシノリアキ氏の以下の記事内のコードを参考にさせていただきました。

tonari-it.com

今日の日付を配列の中の日付から検索するために、一度日付を”m月dd日”にしていますが、ここはお使いのスケジュールの日付欄の形式に合うように調整が必要です。