[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スプレッドシートを開いた時に、今日の入力セルへ自動ジャンプ」への16件のフィードバック

  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++) {
      
      返信

コメントを残す

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

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