Как правильно объединить 2 скрипта в 1? - PullRequest
0 голосов
/ 13 января 2020

Уважаемое сообщество Stackoverflow,

У меня проблемы с объединением двух отдельных скриптов в один. Оба работают нормально, если работают по отдельности, но нет, если оба присутствуют в одном файле. Первый скрипт импортирует CSV в мою электронную таблицу на временный лист с именем «Imported». Второй скрипт импортирует строки из «Imported» на постоянный лист с именем «Main», а затем удаляет временный лист.

Я попытался объединить оба сценария под одной и той же функцией, но это дает только выходной «Импортированный» лист без заполнения основного. То же самое происходит, если я создаю новую функцию, которая сначала вызывает функцию импорта CSV, а затем вызывает функцию импорта в Main.

Для импорта в CSV я использую следующий скрипт, полученный из здесь :

function importCSV() {
var fSource = DriveApp.getFolderById('folder_id_removed'); 
// reports_folder_id = id of folder where csv reports are saved
var fi = fSource.getFilesByName('data.csv'); 
// latest report file
var ss = SpreadsheetApp.openById('spreadsheet_id_removed'); 
// data_sheet_id = id of spreadsheet that holds the data to be updated with new report data

if ( fi.hasNext() ) { // proceed if "report.csv" file exists in the reports folder
var file = fi.next();
var csv = file.getBlob().getDataAsString();
var csvData = CSVToArray(csv); // see below for CSVToArray function
var newsheet = ss.insertSheet('Imported'); // create a 'NEWDATA' sheet to store imported data
// loop through csv data array and insert (append) as rows into 'NEWDATA' sheet
for ( var i=0, lenCsv=csvData.length; i<lenCsv; i++ ) {
  newsheet.getRange(i+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
  }

  }
};

function CSVToArray( strData, strDelimiter ) {
// Check to see if the delimiter is defined. If not,
// then default to COMMA.
strDelimiter = (strDelimiter || ";");

// Create a regular expression to parse the CSV values.
var objPattern = new RegExp(
(
  // Delimiters.
    "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

    // Quoted fields.
    "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

    // Standard fields.
    "([^\"\\" + strDelimiter + "\\r\\n]*))"
  ),
  "gi"
);

// Create an array to hold our data. Give the array
// a default empty first row.
var arrData = [[]];

// Create an array to hold our individual pattern
// matching groups.
var arrMatches = null;

// Keep looping over the regular expression matches
// until we can no longer find a match.
while (arrMatches = objPattern.exec( strData )){

// Get the delimiter that was found.
var strMatchedDelimiter = arrMatches[ 1 ];

// Check to see if the given delimiter has a length
// (is not the start of string) and if it matches
// field delimiter. If id does not, then we know
// that this delimiter is a row delimiter.
if (
  strMatchedDelimiter.length &&
  (strMatchedDelimiter != strDelimiter)
){

  // Since we have reached a new row of data,
  // add an empty row to our data array.
  arrData.push( [] );

}

// Now that we have our delimiter out of the way,
// let's check to see which kind of value we
// captured (quoted or unquoted).
if (arrMatches[ 2 ]){

  // We found a quoted value. When we capture
  // this value, unescape any double quotes.
  var strMatchedValue = arrMatches[ 2 ].replace(
    new RegExp( "\"\"", "g" ),
    "\""
  );

} else {

  // We found a non-quoted value.
  var strMatchedValue = arrMatches[ 3 ];

}

// Now that we have our value string, let's add
// it to the data array.
arrData[ arrData.length - 1 ].push( strMatchedValue );
}

// Return the parsed data.
return( arrData );
};

Для импорта строк из "Импортировано" в "Основное", у меня есть создал этот скрипт:

function importRows() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Imported');
  var des=ss.getSheetByName('Main');
  var src=sh.getRange('A2:F500');
  var vA=src.getValues();
  for(var i=0;i<vA.length;i++) {
    if(vA[i].join("")) {
      des.appendRow(vA[i]);
    }
  }
  ss.deleteSheet(sh)
} 

Я подозреваю, что в скрипте импорта CSV требуются незначительные изменения, но, к сожалению, я не достаточно опытен, чтобы найти ответ сам.

Может ли кто-нибудь помочь мне создать единый скрипт, содержащий обе эти функции? Я буду признателен за любую помощь по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Попробуйте:

function importCSV() {
  var fSource=DriveApp.getFolderById('folder_id_removed'); 
  var fi=fSource.getFilesByName('data.csv'); 
  var ss=SpreadsheetApp.openById('spreadsheet_id_removed'); 
  if (fi.hasNext()) { 
    var file=fi.next();
    var csv=file.getBlob().getDataAsString();
    var csvData=CSVToArray(csv);
    var tsh=ss.getSheetByName('Main');
    for (var i=1;i<csvData.length;i++) {
      tsh.appendRow(csvData[i]);
    }
  }
}

Забудьте об Импортированном, просто поместите его прямо в Основное.

0 голосов
/ 13 января 2020

@ Егор П - вы не можете просто совместить два сценария таким образом. Если два листа находятся в одной электронной таблице, вы сможете запустить вторую функцию из нового проекта: Файл> Создать> Проект.

Вы можете установить вторую функцию как onEdit (e), а не importRows (). Это означает, что как только ваш импорт из CSV завершится, он уже должен быть скопирован на постоянный лист.

Надеюсь, это поможет!

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