Автоматический импорт нового (последнего) файла .csv в существующую таблицу Google - PullRequest
0 голосов
/ 25 мая 2019

Я получаю новый файл CSV каждый час на моем Google Диске. Мне нужно, чтобы моя электронная таблица была обновлена ​​с использованием данных в последнем CSV-файле после того, как они были получены в папке Google Диска.

Файлы, поступающие в папку, имеют уникальное имя для каждого нового в соответствии с датой и временем. Например: FileName_date_24hourtime.csv FileName_20190524_1800.csv, затем FileName_20190524_1900.csv и т. Д.

Во-первых, я не уверен, что лучший подход:

  1. просто с формулой (вероятно, невозможно, не зная точного имени файла?) Вроде = IMPORTDATA

  2. скрипт Google для поиска последнего файла .csv и автоматического импорта сразу после добавления файла в папку на Google Диске

Любая помощь будет отличной!

Файл .csv: Файл .csv содержит 28 строк и данные должны быть разделены на; Файл .csv выглядит так: NAME; -63,06; -58,08; 50,62; -66,67; -80,00 NAME; -61,82; -56,83; -50,55; -77,78; -70,00 NAME; -57,77; -50,21; 52,88; -77,78; -70,00 NAME1; -57,69; -61,48; -55,59; -55,56; -60,00 NAME2; -61,62; -53,79; 50,34; -66,67; -70,00 NAME3; -54,62; -54,57; -52,22; 55,56; -60,00 ... всего 28 строк

Данные должны идти на лист "Import_Stats".

1 Ответ

0 голосов
/ 25 мая 2019

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

Создание основанного на времени триггера со смещением в 1 час:

function trigger() {
  var trg = ScriptApp.newTrigger('checkFiles');
      trg.timeBased().everyHours(1).create();
}

Создать функцию, которая проверяет файлы в папке (например, «checkFiles»).

function checkFiles(alreadyWaited) {
  //get spreadsheet and sheet;
  var id = 'yourSpreadsheetId';
  var ss = SpreadsheetApp.openById(id);
  var sh = ss.getSheetByName('Import_Stats');    

  var folderId = 'yourIdHere'; //folder by id is the simplest way;

  //get folder and files in it;
  var folder = DriveApp.getFolderById(folderId);
  var files       = folder.getFilesByType('text/csv');
  var filesImport = folder.getFilesByType('text/csv'); //fetch files again;

  //try to fetch number of files;
  var scriptProps = PropertiesService.getScriptProperties();
  var numFiles = scriptProps.getProperty('numFiles');

  //count current number of files;
  var numCurr = 0;
  while(files.hasNext()) {
  var f = files.next();
  numCurr++;
  }

  //if this is the first time, save current number;
  if(numFiles===null) { 
    scriptProps.setProperty('numFiles',numCurr);
  }else {
    numFiles = parseInt(numFiles);
  }

  if(numFiles===null||numFiles===(numCurr-1)) {

    //get today and reset everything except hours;
    var today = new Date();
        today.setMinutes(0);
        today.setSeconds(0);
        today.setMilliseconds(0);      

    //iterate over files;
    while(files.hasNext()) {
      var file = files.next();

      //get file creation date and reset;
      var created = file.getDateCreated();
          created.setMinutes(0);
          created.setSeconds(0);
          created.setMilliseconds(0);

      //calculate offset, equals 0 for each file created this hour;
      var offset = today.valueOf()-created.valueOf();

      if(offset===0) {
        //perform data import here;
        var data = file.getBlob().getDataAsString();

        //ignore empty files;
        if(data!=='') { 
          //split data in rows;
          var arr = data.split('\r\n');

          //resplit array if only one row;
          if(arr.length===1) {
            arr = data.split('\n');
          }

          //append rows with data to sheet;
          arr.forEach(function(el){
            el = el.split(';');
            sh.appendRow(el);
          });
        }          
      }

    }

  }else {
    //if never waited, set minute to wait, else add minute;
    if(!alreadyWaited) {
      alreadyWaited = 60000;
    }else {
      alreadyWaited += alreadyWaited;
    }

    //if waited for 10 minutes -> end recursion;
    if(alreadyWaited===600000) {
      Logger.log('Waited 10 minutes but recieved no files!');
      return;
    }

    //wait a minute and recheck;
    Utilities.sleep(60000);
    return checkFiles(alreadyWaited);
  }      
}

И вот что должно произойти:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...