如何将2个脚本正确合并为1个?

时间:2020-01-13 16:35:01

标签: google-apps-script google-sheets

尊敬的Stackoverflow社区,

我很难将2个单独的脚本合并为一个脚本。如果单独运行,两者都可以正常工作,但是如果两者都存在于单个文件中,则两者都不能正常工作。第一个脚本将CSV导入我的电子表格中的临时工作表中,称为“已导入”。第二个脚本将行从“已导入”导入到称为“主”的永久工作表,然后删除该临时工作表。

我尝试将两个脚本合并到同一功能下,但这仅作为输出“已导入”工作表而没有填充主要工作表。如果我创建一个新函数,也会发生同样的情况,该函数首先调用函数导入CSV,然后调用函数导入到Main。

对于CSV导入,我使用的脚本来自here

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 :(得分:0)

@Egor P-您不能完全以这种方式组合两个脚本。如果两个工作表在同一电子表格上,则应该可以从新项目中运行第二个功能:“文件”>“新建”>“项目”。

您可以将第二个函数设置为onEdit(e)而不是importRows(),这意味着从CSV导入完成后,它应该已经复制到永久工作表中。

希望这会有所帮助!

答案 1 :(得分:0)

尝试一下:

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]);
    }
  }
}

忘记导入就直接放在Main中。

相关问题