Сценарий Google Apps: откройте лист в «Сегодняшнюю дату» - PullRequest
0 голосов
/ 05 марта 2020

У меня есть годовой календарь, разделенный на неделю, и целая куча ячеек контента между каждой неделей. По сути, B2: F2 имеет, например, с 1 по 5 января, а затем B15: F15 имеет, например, с 9 по 15 января.

Я пытаюсь открыть этот лист в ячейке, содержащей дату сегодняшнего дня, но приведенный ниже скрипт позволяет мне искать «Сегодня» только в одном столбце (D: D). Я не могу заставить его работать на всем листе.

Пока у меня есть:

function onOpen() {
 var menu = [{name: "Jump to today's date", functionName: "jumpToDate"}];
 SpreadsheetApp.getActiveSpreadsheet().addMenu("Custom", menu);
 jumpToDate();
}

function jumpToDate() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getActiveSheet();
  var range = sheet.getRange("D:D");
 var values = range.getValues();  

 var day = 24*3600*1000;  
 var today = parseInt((new Date().setHours(0,0,0,0))/day);  
 var ssdate; 
 for (var i=0; i<values.length; i++) {
   try {
     ssdate = values[i][0].getTime()/day;
   }

   catch(e) {
   }
   if (ssdate && Math.floor(ssdate) == today) {
     sheet.setActiveRange(range.offset(i,0,1,1));
     break;
   }    
 }
  Logger.log(ssdate);
}

Кажется, это работает только для столбца D, но каждый раз, когда я пытаюсь расширить диапазон в этой строке: это не работает.

  var range = sheet.getRange("Invoice!B2:F500");

Кто-нибудь знает, как я мог сделать эту работу?

ПРИМЕЧАНИЕ: я не писал этот скрипт, я его отключил этот поток :)

Спасибо!

Редактировать:

Мы только go от 5-дневной недели (с понедельника по пятницу)

Вот как выглядит лист: https://docs.google.com/spreadsheets/d/1JQxXy-ErVKATh5cUCD7u6QLQkaDyXfhhGuMKs_xgbh4/edit?usp=sharing

А вот изображение: spreadhseetexample

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Переход к дате

var dt - сегодняшняя дата, поэтому, если вы хотите проверить это в своем текущем календаре, используйте строку, которую я закомментировал. Параметры - год, месяц, день, где месяц - 0-11, а день - 1 - 31. Все это в справочнике JavaScript для объекта Date.

Будьте осторожны с форматированием даты, потому что они должны быть точное совпадение и не забудьте использовать getDisplayValues ​​(), а не getValues ​​() для сравнения.

Возможно, вам потребуется создать устанавливаемый триггер onOpen и не использовать имя onOpen (), в противном случае вы получите более одного триггера, который может вызвать проблемы. Я тестировал этот код в устаревшей ES5, также называемой Rhino

function jumpToDate() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  var sc=2;
  var sr=2
  var dt=new Date();
  //var dt= new Date(2020,0,28);//used this for testing
  var da=dt.getDay();
  var ds=Utilities.formatDate(dt,Session.getScriptTimeZone(), "EEEEEEE, MMMMMMM dd, yyyy");
  var rg=sh.getRange(sr,sc+da-1,sh.getLastRow()-sr+1,1);
  var vs=rg.getDisplayValues();  
  var today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate());
  for(var i=0;i<vs.length;i++) {
    if(ds==vs[i][0]) {
      sh.getRange(i+sr,sc+da-1).activate();  
      break;
    }
  }
}

Javascript Дата

0 голосов
/ 06 марта 2020

Код, который вы используете, работает только для одного диапазона столбцов, и вы хотите использовать диапазон из нескольких столбцов. Я рекомендую вам реализовать решение с использованием класса TestFinder . Вот пример для вашего случая:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];

// Creates  a text finder.
var textFinder = sheet.createTextFinder(today);

// Returns the first occurrence cell of 'today' in the sheet.
var firstOccurrenceRange = textFinder.findNext();

// Sets the active range
sheet.setActiveRange(firstOccurrenceRange)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...