Сравнение дат в Google Apps Scrips с помощью For Loops - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь сравнить указанную пользователем дату с датой в банке данных на другом листе. Сценарий должен возвращать указанные столбцы любой строки с соответствующей датой. В настоящее время он возвращает все данные. Кажется, что оператор IF всегда читается как истина, независимо от значений. Журналы показывают, что значения разные. Почему этот IF-оператор всегда возвращает true и, таким образом, возвращает все строки банка данных? Код ниже:

function search() 
{

//clears contents in search sheet (sheet1)
var app=SpreadsheetApp;
var WorkSheet =  app.getActiveSpreadsheet().getSheetByName("Sheet1");
WorkSheet.getRange("A2:D50").clearContent();

//store date search value - getrange x and get it's value
var DateSearch = WorkSheet.getRange(1,2).getValue();
//view variable for testing
Logger.log(DateSearch);

//data sheet lastrow variable
var dataSheet = app.getActiveSpreadsheet().getSheetByName("Form Responses 
1");
var a = dataSheet.getDataRange().getNumRows();
//view variable for testing
Logger.log(a);

//var i is looper
var i;
var dataI;
var copyValue;
//view if statement value for testing

for(i=2;i<=a;i++)
{
Logger.log(i);
dataI = dataSheet.getRange(i,1).getValue();
Logger.log(dataI); 
Logger.log(DateSearch);

if (dataI = DateSearch)
{
  // returns values in variable row and first 2 columns if condition is met
  copyValue = dataSheet.getRange(i, 1, 1, 2).getValues();
  //test copyValue
  Logger.log(copyValue);
  WorkSheet.getRange(i,1,1,2).setValues(copyValue);
    }
  }
}

1 Ответ

0 голосов
/ 26 августа 2018

Как насчет этой модификации?

Очки модификации:

  • В случае if (dataI = DateSearch), когда DateSearch имеет значение, оно всегда работает как true. Таким образом, скрипт, когда if равен true, работает каждый раз.
  • Когда сравниваются 2 значения даты, сравните их, преобразовав в число.
    • Это упомянуто из @ tehhowch

Модифицированный скрипт:

Чтобы отразить вышеуказанные пункты, измените их следующим образом и попробуйте снова. Первый и последний сравнивают время Unix и каждый год, месяц и день соответственно. Вы можете выбрать один из 2 образцов.

От:
if (dataI = DateSearch)
Для того, чтобы:
if (new Date(dataI).getTime() === new Date(DateSearch).getTime())

Или

Для того, чтобы:
if (new Date(dataI).getFullYear() === new Date(DateSearch).getFullYear() &&
    new Date(dataI).getMonth() === new Date(DateSearch).getMonth() &&
    new Date(dataI).getDate() === new Date(DateSearch).getDate())

Другие модификации:

Кстати, из вашего сценария и примера электронной таблицы считается, что когда количество данных становится большим, время обработки становится большим. Так как другая модификация для этой ситуации, как насчет этого? Но я не уверен, полезно ли это для вашей ситуации. Поэтому, пожалуйста, подумайте об этом, как пример сценария.

function search() {
  var app=SpreadsheetApp;
  var WorkSheet =  app.getActiveSpreadsheet().getSheetByName("Sheet1");
  WorkSheet.getRange("A2:D50").clearContent();
  var DateSearch = WorkSheet.getRange(1,2).getValue();
  var dataSheet = app.getActiveSpreadsheet().getSheetByName("Form Responses 1");

// Below script was modified.
  var dataI = dataSheet.getDataRange().offset(1, 0).getValues();
  var copyValue = dataI.map(function(e, i) {
    return new Date(e[0]).getTime() === new Date(DateSearch).getTime() ? e : ["", ""];
  });
  WorkSheet.getRange(2,1,copyValue.length,copyValue[0].length).setValues(copyValue);
}

Рекомендации:

Если этот результат был не тем, что вы хотите, пожалуйста, скажите мне. Я хотел бы изменить его.

Добавлено:

Этот сценарий модификации помещает полученные значения без пустых строк в строку 2.

function search() {
  var app=SpreadsheetApp;
  var WorkSheet =  app.getActiveSpreadsheet().getSheetByName("Sheet1");
  WorkSheet.getRange("A2:D50").clearContent();
  var DateSearch = WorkSheet.getRange(1,2).getValue();
  var dataSheet = app.getActiveSpreadsheet().getSheetByName("Form Responses 1");

// Below script was modified.
  var dataI = dataSheet.getDataRange().offset(1, 0).getValues();
  var copyValue = dataI.filter(function(e) { // Modified
    return new Date(e[0]).getTime() === new Date(DateSearch).getTime(); // Modified
  });
  WorkSheet.getRange(2,1,copyValue.length,copyValue[0].length).setValues(copyValue);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...