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

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

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

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

スクリプト

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

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


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

function goToTodayCell(dateColNo, jumpColNo ) {
  //var dateColNo = 1;   // 日付列番号 A列が1
  //var jumpColNo = 3;  // ジャンプさせるカラム番号 A列が1

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

  sheet.getRange(1,1).setBackgroundColor("red");

  var maxRow = sheet.getMaxRows();//最終行を取得

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

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

  var matchRow = maxRow; // マッチする行が無かったら最終行へ

  for (var i = 1; i < maxRow; i++) {
    var dateValue = yyyymmdd(values[i][dateColNo-1]);
    if(stringToday == dateValue){
      matchRow = i+1; // 配列は 0から、シートは1から
    }
  }
  sheet.getRange(matchRow, jumpColNo).activate();  // セルへ移動
  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;
}
18/12/08:  28行目、"<" が 特殊文字"&lt;"になっていたのを修正
for (var i = 1; i &lt; maxRow; i++) {
↓
for (var i = 1; i < maxRow; i++) {

 

トリガー設定

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

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

google apps script トリガー

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

スポンサーリンク

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

  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エディタのデバッガで、ブレイクポイント設定して値を見てみる

コメントを残す

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

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