简体   繁体   中英

How to append all spreadsheets in the same folder?

I am trying to append all spreadsheets from the same folder to a master sheet.

I have found a similar code here but I can append the spreadsheets only when the master sheet is also in the selected folder. How could it be modified so that it could be able to applicable to other folders?please advise~

function appendData() {
  var sheet = SpreadsheetApp.getActiveSheet();

  var folder = DriveApp.getFolderById("1UQ5J3xdNnqyHvC-CJ1vAu5YPSxq9Sya9");
  var files = folder.getFiles();
  var cnt=0;
  while (files.hasNext()) {
    var file = files.next();
    cnt++;
    // if the file is not a Sheet, skip it
    if (file.getMimeType() != "application/vnd.google-apps.spreadsheet") {
      continue;
    }

    var importSheet = SpreadsheetApp.openById(file.getId())
    // assuming you only want to append the first sheet of each Spreadsheet:
    var range = importSheet.getSheets()[0].getDataRange();

    // extend the main sheet if you need to:
    try {
      sheet.getRange(1, 1, sheet.getDataRange().getNumRows() + range.getNumRows(), 1);
    }
    catch (e) {
      sheet.insertRowsAfter(sheet.getDataRange().getNumRows(), range.getNumRows() + 1);
    }    
    // remove the headers from the data to copy:    
    range = importSheet.getSheets()[0].getRange(2, 1, range.getNumRows() - 1, range.getNumColumns())

    // copy the data:
    sheet.getRange(sheet.getDataRange().getNumRows() + 1, 1, range.getNumRows(), range.getNumColumns()).setValues(range.getValues());    
  }
}

Try this:

function appendData() {
  var sheet=SpreadsheetApp.getActiveSheet();
  var folder=DriveApp.getFolderById("1UQ5J3xdNnqyHvC-CJ1vAu5YPSxq9Sya9");
  var files=folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  while (files.hasNext()) {
    var file = files.next();
    var importSheet=SpreadsheetApp.openById(file.getId())
    var values=importSheet.getSheets()[0].getDataRange().getValues();
    sheet.getRange(sheet.getLastRow()+1,1,values.length,values[0].length).setValues(values);    
    Logger.log(file.getName());
  }
}

Append both spreadsheets and Excel files to the same master sheet

If you need to append not only sheets from Google spreadsheets, but also form Excel files, you need to convert the latter ones to Google Sheets first.

For this, you can modify your existing code as following:

function appendData() {
  var sheet = SpreadsheetApp.getActiveSheet();

  var folder = DriveApp.getFolderById("1fUpTphVpYGfLv6SjWxZdbcIK7PHCZOnt");
  var files = folder.getFiles();
  var cnt=0;
  while (files.hasNext()) {
    var file = files.next();
    cnt++;
    // if the file is an excel - convert it to sheet    
    if (file.getMimeType() != "application/vnd.google-apps.spreadsheet") {
      Logger.log(file.getMimeType());
//here is the additional part
//define here mime-types of interest and convert them
      if (file.getMimeType() == "application/vnd.ms-excel" || file.getMimeType() == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") {
        var fileId = file.getId();
        var folderId = folder.getId();
        var blob = file.getBlob();
        var resource = {
          title: file.getName(),
          mimeType: MimeType.GOOGLE_SHEETS,
          parents: [{id: folderId}],
        };      
        var file = Drive.Files.insert(resource, blob);
      }else{
        continue;
      }
    }      
    var importSheet = SpreadsheetApp.openById(file.getId())
    // assuming you only want to append the first sheet of each Spreadsheet:
    var range = importSheet.getSheets()[0].getDataRange();

    // extend the main sheet if you need to:
    try {
      sheet.getRange(1, 1, sheet.getDataRange().getNumRows() + range.getNumRows(), 1);
    }
    catch (e) {
      sheet.insertRowsAfter(sheet.getDataRange().getNumRows(), range.getNumRows() + 1);
    }    
    // remove the headers from the data to copy:  

    range = importSheet.getSheets()[0].getRange(2, 1, range.getNumRows() - 1, range.getNumColumns())
    Logger.log("range.getA1Notation():" + range.getA1Notation());
    // copy the data:
    sheet.getRange(sheet.getDataRange().getNumRows() + 1, 1, range.getNumRows(), range.getNumColumns()).setValues(range.getValues());    
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM