[Google Apps Script] Googleスプレッドシートを開いた時に、今日の入力セルへ自動ジャンプ

ネット・PC

Googleスプレッドシートで、毎日データを記入しているものがある場合に、スプレッドシートを開いた時に、自動的にその日の入力セルにジャンプしてくれると便利です。

(列方向(横方向)版は → Google Spreadsheetでシートを開いたら、今日のセルへ移動(列版))

スクリプト

googleスプレッドシートの “ツール” → “スクリプトエディタ” で、以下のスクリプトを貼り付けます。

日付列(または、シートの全データ)を配列に読み込み、今日の日付と同じ行を調べ、その行と指定された列番号のセルに移動させています。
(配列に読み込まず、セルをの一つづつ調べていくと、処理がかなり遅くなってしまいます。)
日付列は、日付データであれば、シート上の表示形式は違っていても大丈夫です。

// onOpen関数はスプレッドシートが開けられる度に自動的に実行される
function onOpen() {
  goToTodayCell(1 , 3 ,2 ); // 日付列 A列→1 ジャンプさせるカラム番号 C→3 日付チェック開始行 2
  //goToTodayCell(2, 3, 21); // 日付列 B列→2  ジャンプさせるカラム番号 C→3 日付チェック開始行 21
}

function goToTodayCell(dateColNo, jumpColNo ,startRow ) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.getRange(1,1).setBackgroundColor("red");
  var maxRow = sheet.getMaxRows();//最終行を取得
  var values = sheet.getRange(startRow, dateColNo , maxRow).getValues();  // 対象絡カラムのみを配列に格納
  var today = new Date();
  var stringToday = yyyymmdd(today);
  var matchRow = maxRow; // マッチする行が無かったら最終行へ
  for (var i = 0; i < maxRow; i++) {
    var dateValue = yyyymmdd(values[i][0]);
    if(stringToday == dateValue){
      matchRow = i + startRow ; // 配列は 0から、シートは1から
      sheet.getRange(matchRow, jumpColNo).activate();  // セルへ移動
      break;
    }
  }
  sheet.getRange(1,1).setBackgroundColor("white");
  return;
}

// dateを日付のみにする
// Mon Jan 21 2013 13:37:00 GMT+0900 (JST)  ->  2012/07/05
function yyyymmdd(dateVal)
{
  var stringDate
  var date = new Date(dateVal);
  if(date.toString() == 'Invalid Date'){  //日付データでない
    stringDate = date;
  } else {
    stringDate = date.getFullYear() + "/" + ("0" + (date.getMonth()+1)).slice(-2) + "/" + ("0" + date.getDate()).slice(-2);
  }
  return stringDate;
}
2018/12/08:  28行目、"<" が 特殊文字"&lt;"になっていたのを修正
for (var i = 1; i &lt; maxRow; i++) {
↓
for (var i = 1; i < maxRow; i++) {

2019/04/12:
・if 文で、breakしていなかったのを修正
・日付チェック開始行を指定できるように修正。

トリガー設定

スプレッドシートを開いた時に onOpen() が呼ばれるようにトリガーを設定します。

”スクリプトエディタ”の”現在のプロジェクのトリガ(時計マーク)”をクリックし、下図のように
実行 → “onOpen”
イベント → “スプレッドシートから” “起動時”
を設定し、”保存” をクリックし保存します。

google apps script トリガー

コメント

  1. shun より:

    上記の通りやっているのですが、エラーになってしまいます。
    エラーの内容は以下のとおりです。
    TypeError: オブジェクト で関数 getFullYear が見つかりません。

    そこで「// dateを日付のみにする」から下行すべてを削除し、
    再度実行すると、以下のエラーが表示されます。
    ReferenceError: 「yyyymmdd」が定義されていません。
    なにか原因はわかりますか?
    ご教授いただけますと幸いです。

    • kanrinin より:

      コードに不備があるようでした。
      現在動いているものと差し替えてみました。
      再度、試していただけますでしょうか。
      よろしくお願いします。

      • 無二斎 より:

        open時に今日にカーソルを飛ばす!という同じ悩みを抱え、ここへたどり着きました。

        上記スクリプトをペーストして実行しましたが、一番最後の行へ移動してしまいます。
        何が問題なのでしょうか?ご教授下さい。
        3年前の投稿なので、大丈夫かな?

        • kanrinin より:

          ・開始セルがズレている
          ・日付のフォーマットが異なる
          ではないかと思われます。

          具体的なシートデータいただければ、確認させていただくことも可能です。

  2. より:

    こんにちは。
    上記の通り貼り付けてみたのですが、全く反応してくれませんでした。
    何かやり方が間違っているのでしょうか?

    • kanrinin より:

      該当シートで、「ツール」→「スクリプトエディタ」で、貼り付けられましたでしょうか?

  3. 初めまして。会社のスケジュールをスプレッドシートで管理しているものです。
    日付が行になっている場合、どこを編集すればよいのでしょうか。
    単純にRowとColを書き替えすればいいと思ったのですが、うまくいきませんでした。
    もしよろしければご教授して頂けませんでしょうか。よろしくお願いします。

    ・日付は1行目に1か月分。(横に並んでいる)
    ・ジャンプさせる行は3行目

  4. 忍月 より:

    質問させてください。
    日付が行ではなく列で伸びている場合はどうしたらいいのでしょう?
    RowをColumnに書き換えればいいのだろうか?と考えて
    以下のように試してみたのですがうまく動きません。
    アドバイスをいただけないでしょうか?

    // onOpen関数はスプレッドシートが開けられる度に自動的に実行される
    function onOpen() {
    goToTodayCell(2,2); // 日付行番号
    }

    function goToTodayCell(dateRowNo, jumpRowNo ) {
    //var dateRowNo = 2; // 日付行番号
    //var jumpRowNo = 2; // ジャンプさせる行番号

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

    sheet.getRange(1,1).setBackgroundColor(“red”);

    var maxColumn = sheet.getMaxColumn();//最終行を取得

    var values;
    if(false){
    values = sheet.getDataRange.getValues(); //データを配行に格納 (全データ)
    } else {
    values = sheet.getRange(1, dateRowNo , maxRow).getValues(); // 対象絡行のみを配行に格納
    }

    var today = new Date();
    var stringToday = yyyymmdd(today);

    var matchColumn = maxColumn; // マッチする列が無かったら最終列へ

    for (var i = 1; i 2012/07/05
    function yyyymmdd(dateVal)
    {
    var stringDate
    var date = new Date(dateVal);
    if(date.toString() == ‘Invalid Date’){ //日付データでない
    stringDate = date;
    } else {
    stringDate = date.getFullYear() + “/” + (“0” + (date.getMonth()+1)).slice(-2) + “/” + (“0” + date.getDate()).slice(-2);
    }
    return stringDate;
    }

  5. 緑茶 より:

    縦ではなく、横に日付を配置した場合はどうするのでしょうか?

  6. 姜成民 より:

    一個質問ですが、列ではなく行の場合はどうすればいいでしょうか?
    私は5行目に縦ではなく横に日付を自動で入れてまして、何とかしたいですが。

  7. ine_allergy より:

    for-loop コントロールの後に ) がありません。(行 28、ファイル「コード」)

    上記のエラーがでるのですが、どうしたらよいでしょうか?

    • kanrinin より:

      28行目、”<" が 特殊文字"<"になっていたので、これが原因かと。修正しておきました。

      for (var i = 1; i < maxRow; i++) {
      ↓
      for (var i = 1; i < maxRow; i++) {
      
      • ine_allergy より:

        解決いたしました!ありがとうございました!

        • 管理人 より:

          解決されたとのことで、何よりです!

          • ine_allergy より:

            列版もやってみたのですが、下記のエラーが出てしまいます、、

            TypeError: undefined からプロパティ「0」を読み取れません。(行 24、ファイル「コード」)

            どうしたらいいでしょうか?

          • 管理人 より:

            > 列版もやってみたのですが、下記のエラーが出てしまいます、、
            >
            > TypeError: undefined からプロパティ「0」を読み取れません。(行 24、ファイル「コード」)
            >
            > どうしたらいいでしょうか?

            サンプルコードでは、24行目はコメントになっているようなのですが、
            エラーになるコードの24行目はどのような内容でしょうか?
            可能であれば、コード見せていただければ。

          • ine_allergy より:

            24行目はこちらになっています   

             var dateValue = yyyymmdd(dateRowsValues[StartColumn-1][column]); // 配列は 0から、シートは1から

          • 管理人 より:

            実際のシートで、日付の列は何行目に入っていますか?

            上記と、コードの3行目の行番号(下記では5)は、合ってますでしょうか?
            goToTodayCell(5,1); // 日付開始セルの指定 行番号,列番号(A列が1)

          • ine_allergy より:

            実際のシートはC3から右に日付が続いています。

            冒頭の部分を下記のように編集してみたのですが、
            うまくまわらず、、、

            function onOpen() {
              goToTodayCell(3,3); // 日付開始セルの指定 行番号,列番号(A列が1)
            }

          • 管理人 より:

            そこは、合っているようですね。

            であれば、エラーが出てる
            24行目
            var dateValue = yyyymmdd(dateRowsValues[StartColumn-1][column]);
            の dateRowsValues[StartColumn-1][column] などが、どのような値になっているかを、下記などの方法で見てみてはいかがでしょうか?
            ・「Browser.msgBox」で表示する
            ・Google Apps Scriptエディタのデバッガで、ブレイクポイント設定して値を見てみる

  8. yours より:

    質問です。
    日付の列をB列に変更しました。
    goToTodayCell(1,3); // 日付列番号 A列が1 ジャンプさせるカラム  から

    goToTodayCell(2,3); // 日付列番号 A列が1 ジャンプさせるカラム  に

    変更してもA列を検索してます。

    因みに日付は、案件ごとに重複するのですが、、問題ありますか?


    2019/4/11
    2019/4/11
    2019/4/12
    2019/4/12
    2019/4/13
    2019/4/13

  9. yours より:

    質問です。

    A列が日付データになると思うますが。
    当方、B列に日付データが入っています。
    B列でも同じ日が存在し、下記のようになります。
    120 2019/04/10
    121 2019/04/11
    122 2019/04/12
    123 2019/04/12
    124 2019/04/12
    125 2019/04/12
    126 2019/04/15
    127 2019/04/16
    128 2019/04/17
    129 2019/04/18

    サンプルでは、goToTodayCell(1,3); カッコ内の1が日付列番号 A列だと
    思いますが、goToTodayCell(1,3); をgoToTodayCell(2,3); のように1(A列)を2(B列)に
    変更してもセルが移動しません。

    どのように変更すればよろしいのでしょうか?

    • 管理人 より:

      > 日付の列をB列に変更しました。
      > goToTodayCell(1,3); // 日付列番号 A列が1 ジャンプさせるカラム  から
      > goToTodayCell(2,3); // 日付列番号 A列が1 ジャンプさせるカラム  に
      > 変更してもA列を検索してます。

      B列を指定した場合、下記の様にしないとダメなようでした。ソース修正しました。
      //var dateValue = yyyymmdd(values[i][dateColNo-1]);

      var dateValue = yyyymmdd(values[i][0]);

      > 因みに日付は、案件ごとに重複するのですが、、問題ありますか?
      >
      > 例
      > 2019/4/11
      > 2019/4/11
      > 2019/4/12
      > 2019/4/12

      行を下方向に検索しているので、最初にマッチした行に移動します。

  10. yours より:

    ご回答ありがとうございます。

    やはり、移動してくれません。

    更に詳しくお伝えいたします。

    1行目から20行目は固定されていて、日付は入力されていません。
    21行目からは下記のとおりです。

    A列 B列      C列
    No. 配信開始日 曜日
    21 2019/01/01 火
    22 2019/01/02 水
    ~~~~~~~~~~~~~~~~~~~~~~~
    120 2019/04/10 水
    121 2019/04/11 木
    122 2019/04/12 金
    123 2019/04/12 金
    124 2019/04/12 金
    125 2019/04/12 金
    126 2019/04/15 月
    127 2019/04/16 火
    128 2019/04/17 水
    129 2019/04/18 木

    となっています。

    > //var dateValue = yyyymmdd(values[i][dateColNo-1]);
    > ↓
    > var dateValue = yyyymmdd(values[i][0]);

    上記のように変更しましたが・・・

    どのように変更すればよろしいのでしょうか?

  11. omatu101 より:

    会社で社有車の予約表に使いました。おかげ様でストレスなく予約表が扱えるようになり大変助かりました。ありがとうございました。

    • 管理人 より:

      > 会社で社有車の予約表に使いました。おかげ様でストレスなく予約表が扱えるようになり大変助かりました。ありがとうございました。

      お役にたてて、何よりです^^

  12. masa より:

    拝見しました。
    コードの例を参考に
    sheet.range(row,column)..activate();

    を行うと、PC環境では指定のセルがアクティブになりますが、iPadやiPhoneのアプリでは同じ動作にならないようです。kenlog様の環境ではいかがでしょうか?

    • 管理人 より:

      > PC環境では指定のセルがアクティブになりますが、iPadやiPhoneのアプリでは同じ動作にならないようです。kenlog様の環境ではいかがでしょうか?

      すいません。かなり前のもので、iPadやiPhoneでは、動作確認してません。

      ただ、IOS系は、リロードがリアルタイムでかからないみたいなので、そのあたりのせいではないかな~と。

  13. kuri より:

    仕事で使うシートに活用させて頂いています。
    その日の日付セルへの移動をメニューバーに追加したGAS実行ボタンに割り当てたいのですが、うまく動きません。実行させる関数として”goToTodayCell”を記載していますが、下記のエラーが出てしまいます。解決策があれば教えて下さい(F5でリロードでも事足りるのですが、時間がかかるので・・・)

    Exception: パラメータ(null,null,number)が SpreadsheetApp.Sheet.getRange のメソッドのシグネチャと一致しません。

    • 管理人 より:

      > Exception: パラメータ(null,null,number)が SpreadsheetApp.Sheet.getRange のメソッドのシグネチャと一致しません。

      エラーメッセージからすると、下記でエラーが出てると思われるのですが
      var values = sheet.getRange(startRow, dateColNo , maxRow).getValues(); // 対象絡カラムのみを配列に格納
      startRow, dateColNo が null だから?

      怪しいのは
      goToTodayCell(1 , 3 ,2 ); // 日付列 A列→1 ジャンプさせるカラム番号 C→3 日付チェック開始行 2
      :
      function goToTodayCell(dateColNo, jumpColNo ,startRow ) {
      あたりで、シートの対応
      全角スペースが入っていないかなど確認
      あたりでしょうか
      dateColNo,startRow に、どんな値が渡っているか確認されると良いかと

タイトルとURLをコピーしました