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

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

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

googleスプレッドシート 今日の入力セルへ自動ジャンプ

スクリプト

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)  -&gt;  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 トリガー

↓ 参考になるブログがたくさんあります!ぜひどうぞ! ↓
にほんブログ村 その他日記ブログ 日々のできごとへ

スポンサーリンク

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

  1. shun

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

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

    返信
    1. kanrinin 投稿作成者

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

      返信
      1. 無二斎

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

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

        返信
        1. kanrinin 投稿作成者

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

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

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

    返信
    1. kanrinin 投稿作成者

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

      返信
  3. クリーンプラネット (@CleanPlanet3)

    初めまして。会社のスケジュールをスプレッドシートで管理しているものです。
    日付が行になっている場合、どこを編集すればよいのでしょうか。
    単純に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. 姜成民

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

    返信
  6. ine_allergy

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

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

    返信
    1. kanrinin 投稿作成者

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

      for (var i = 1; i < maxRow; i++) {
      ↓
      for (var i = 1; i < maxRow; i++) {
      
      返信
          1. ine_allergy

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

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

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

          2. 管理人 投稿作成者

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

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

          3. ine_allergy

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

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

          4. 管理人 投稿作成者

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

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

          5. ine_allergy

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

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

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

          6. 管理人 投稿作成者

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

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

  7. 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

    返信
  8. 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列)に
    変更してもセルが移動しません。

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

    返信
    1. 管理人 投稿作成者

      > 日付の列を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

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

      返信
  9. 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]);

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

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

    返信
    1. 管理人 投稿作成者

      テストデータ(不要な部分は削除した)シートを共有していただき、
      シートのURLを
      問い合せ http://kenlog.net/contact/
      から送っていただければ、見てみますが。

      返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください