Фильтровать данные CSV от 2 дней назад до 15 дней спустя - PullRequest
0 голосов
/ 19 сентября 2019

Чтобы не отфильтровывать очень старые данные, я смог точно настроить импорт ... Но файл содержит данные по состоянию на май 2020 года, не имеет для меня значения и много весит электронную таблицу.

Я бы хотел ограничить этот импорт данными только до 15 дней.Остальным не нужно.

Что мне нужно добавить в скрипт, чтобы он мог сделать этот будущий фильтр?Заранее спасибо

function FiveThirtyEight() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Import CSV Data'), true);
  var sheet = spreadsheet.getActiveSheet();
  sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

  var url = "https://projects.fivethirtyeight.com/soccer-api/club/spi_matches.csv";
  var data = UrlFetchApp.fetch(url).getContentText();
  var csv = Utilities.parseCsv(data);
  var MILLIS_PER_DAY = 1000 * 60 * 60 * 24 * 2;
  var now = new Date();
  now.setHours(0,0,0,0);
  var yesterday = new Date(now.getTime() - MILLIS_PER_DAY);
  var values = csv.filter(function(e, i) {
    var temp = new Date(e[0]);
    temp.setHours(0,0,0,0);
    return i > 0 && temp.getTime() >= yesterday;
  });
  values.unshift(csv[0]);
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(1, 1, values.length, values[0].length).setValues(values);

  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('Import CSV Data!H:J').activate();
  spreadsheet.getActiveRangeList().setNumberFormat('0.00%');
}

1 Ответ

0 голосов
/ 19 сентября 2019

Попробуйте:

Я обнаружил несколько проблем с вашим текущим кодом.Во-первых, ваш фильтр не работал, потому что он не вычислял временную дату.Я думаю, что черты вызывали проблемы для конструктора Date ().В любом случае, я внес в него несколько изменений, и теперь вы можете ясно видеть диапазон дат, посмотрев объявления для daysAgo и daysLater.У них есть -2 и +15 в конце каждой строки, и они контролируют ваш временной интервал для данных относительно текущей даты.

Вам больше не нужно отменять смещение () строки конца заголовка, потому что я пропустил в цикле фильтра.Фильтр сохраняет строку, если возвращаемое значение равно true, и удаляет строку, если возвращаемое значение равно false.

Также вам вообще не нужно использовать activ ().Я думаю, что это остаток пользователей, которые начали изучать свой код из макросов.

function FiveThirtyEight() {
  var ss = SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Import CSV Data');
  var rg=sh.getRange(1, 1, sh.getMaxRows(), sh.getMaxColumns());
  rg.clear({contentsOnly:true});
  var url="https://projects.fivethirtyeight.com/soccer-api/club/spi_matches.csv";
  var data=UrlFetchApp.fetch(url).getContentText();
  var csvA=Utilities.parseCsv(data);
  var now=new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate());
  var daysAgo=new Date(now.getFullYear(),now.getMonth()+1,now.getDate()-2);
  var daysLater=new Date(now.getFullYear(),now.getMonth()+1,now.getDate()+15);
  var values=csvA.filter(function(e, i) {
    if(i>0) {
    var tA=e[0].split('-');//split on dashes to get FullYear,month and date
    var temp=new Date(tA[0],tA[1],tA[2]);
    return temp.getTime() >= daysAgo.getTime() && temp.getTime()<=daysLater.getTime();//this keeps data within the desired date range
    }else{
      return true;
    }
  });
  sh.getRange(1, 1, values.length, values[0].length).setValues(values);
  sh.getRange('Import CSV Data!H:J').setNumberFormat('0.00%');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...