2016-04-15 32 views
0

我在Google文件夾中放置了一打工作表。通過下面的腳本,我可以將每個文件的第一個選項卡複製到新的電子表格中。 但是現在我希望所有的數據只需在一個選項卡中複製,並將其作爲csv文件下載到共享驅動器(而不是谷歌應用程序)。數據的格式總是相同的,有時每行的行數不同。合併多個選項卡,以CSV格式下載

此外,我想選擇基於名稱而不是數字的選項卡 - 以避免將來發生錯誤。任何建議如何解決這個問題?

function mergeSheets() { 

/* Retrieve the desired folder */ 
var myFolder = DriveApp.getFoldersByName('name of folder').next(); 

/* Get all spreadsheets that resided on that folder */ 
var spreadSheets = myFolder.getFilesByType("application/vnd.google- apps.spreadsheet"); 

/* Create the new spreadsheet that you store other sheets */ 
var newSpreadSheet = SpreadsheetApp.create("Merged Sheets"); 

/* Iterate over the spreadsheets over the folder */ 
while(spreadSheets.hasNext()) { 

var sheet = spreadSheets.next(); 

/* Open the spreadsheet */ 
var spreadSheet = SpreadsheetApp.openById(sheet.getId()); 

/* Get all its sheets */ 
// for(var y in spreadSheet.getSheets()) { 

    /* Copy the sheet to the new merged Spread Sheet */ 
    spreadSheet.getSheets()[0].copyTo(newSpreadSheet); 
// } 
}  
} 

回答

0

下面是使用更快速的方法將文件夾中的所有電子表格編譯成單個電子表格表單的另一種可能解決方案(concatenate arrays)。

唯一的限制是,所有的表必須有相同數量的列(行號並不重要)

從這個單張它會很容易對其contnet導出爲CSV並將其保存爲一個驅動器文件。 我用你的代碼作爲起點,並評論那些迭代每個電子表格中所有表單的部分,就像你做的一樣,但是你當然可以取消註釋for循環)。 我添加了一些註釋來解釋過程。

function mergeSheets() { 
    /* Retrieve the desired folder */ 
    //var myFolder = DriveApp.getFoldersByName('name of folder').next(); 
    // or better 
    var myFolder = DriveApp.getFolderById('0B3qSFd3iikE3RDhxekVYNk5zUkk'); 

    /* Get all spreadsheets that resided on that folder */ 
    var spreadSheets = myFolder.getFilesByType(MimeType.GOOGLE_SHEETS); 

    /* Create the new spreadsheet that you store other sheets */ 
    var newSpreadSheet = SpreadsheetApp.create("Merged Sheets"); 
    var newSheetTab = newSpreadSheet.getActiveSheet(); 
    var values = [] ;// new array to get all sheets contents 
    /* Iterate over the spreadsheets over the folder */ 
    var header = []; 
    while(spreadSheets.hasNext()) { 

    var sheet = spreadSheets.next(); 
    Logger.log(sheet.getName()); // log the sheet name to check 
    /* Open the spreadsheet */ 
    var spreadSheet = SpreadsheetApp.openById(sheet.getId()); 

    /* Get all its sheets */ 
    // for(var y in spreadSheet.getSheets()) { 

    //for(var sheet in spreadSheet.getSheets()){ 
     var sheet = spreadSheet.getSheets()[0];// comment this line if you keep the for loop 
     var range = sheet.getDataRange(); 
     var data = range.getValues(); 
     if(header.length==0){ 
     header = data.shift(); // get the header only once and remove header from data in the same time 
     }else{ 
     var dummy = data.shift(); // remove header from data but don't keep it 
     } 
     values = values.concat(data); // add data to final array in each while loop 
    // } 
    } 
    values.unshift(header); // add the header at the array start 
    Logger.log(values);//see result 
    newSheetTab.getRange(1,1,values.length, values[0].length).setValues(values);// batch write to the sheet 
} 

// then export this single sheet as CSV see code from Google tuto 
// https://developers.google.com/apps-script/articles/docslist_tutorial#section-3-saving-a-selected-range-to-a-csv-file 
+0

謝謝,這個作品像魅力!只是一個小問題,我如何在合併後的表格中獲得日期格式爲日期的列? – mrtn

+0

您可以使用[setNumberFormat](https://developers.google.com/apps-script/reference/spreadsheet/range#setnumberformatnumberformat)在範圍內設置格式,例如使用getRange('A2:A' )爲col'A',然後將該範圍的格式設置爲「mm/dd/yyyy」以在A列中顯示日期爲mm/dd/yyyy。 –

0
function mergeSheets() { 

/* Retrieve the desired folder */ 
var myFolder = DriveApp.getFoldersByName('name of folder').next(); 

/* Get all spreadsheets that resided on that folder */ 
var spreadSheets = myFolder.getFilesByType("application/vnd.google- apps.spreadsheet"); 

/* Create the new spreadsheet that you store other sheets */ 
var newSpreadSheet = SpreadsheetApp.create("Merged Sheets"); 
var newSheetTab = newSpreadSheet.getActiveSheet(); 

/* Iterate over the spreadsheets over the folder */ 
while(spreadSheets.hasNext()) { 

var sheet = spreadSheets.next(); 

/* Open the spreadsheet */ 
var spreadSheet = SpreadsheetApp.openById(sheet.getId()); 

/* Get all its sheets */ 
// for(var y in spreadSheet.getSheets()) { 

    /* Copy the sheet to the new merged Spread Sheet */ 
    var range = spreadSheet.getSheetByName('sheet name').getDataRange(); 

    // start after header row 
    // may have to adjust these upon desired effect 
    for (var i = 1; i < range.getNumRows(); i++) 
    { 
     newSheetTab.appendRow(range[i]); 
    } 

// } 
} 

// then save as csv 
} 

參考this blog如何保存爲csv。

+0

你的腳本可能會**更快**如果不是追加行,而是將整個dataRange值作爲數組連接到一個大的結果數組中,然後一次將該數組寫入目標工作表。 –

+0

是的它可以,這只是一個快速的代碼在旅途中寫,他需要一個解決方案 – Gerneio

+0

我明白但肯定,但它是一個典型的情況下,建議的腳本可能會令人失望(如果不是不可用,如果他有大量的數據)爲忽略GAS最佳實踐的用戶。這就是我在這裏提到它的原因。 –