2016-04-15 7 views
0

Googleフォルダに12枚のシートがあります。以下のスクリプトを使用して、各ファイルの最初のタブを新しいスプレッドシートにコピーすることができます。 しかし、すべてのデータを1つのタブにコピーし、csvファイルとして共有ドライブ(Google Appsではなく)にダウンロードしてもらいたい。データの形式は常に同じです。たまに行数がシートごとに異なる場合があります。複数のタブをマージし、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)を使用して、フォルダからすべてのスプレッドシートを単一のスプレッドシートにコンパイルする別の方法です。

唯一の制限は、(行番号は重要ではありません)

この単一のシートから、CSVへのcontnetをエクスポートし、ドライブとして保存するのは簡単だろう、すべてのシートが同じ列数を持たなければならないということですファイル。 私はあなたのコードを出発点として使っていましたが、各スプレッドシート内のすべてのシートを繰り返す部分についてコメントしましたが、もちろん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

getRange( 'A2:A')で範囲を定義するなど、[setNumberFormat](https://developers.google.com/apps-script/reference/spreadsheet/range#setnumberformatnumberformat) )を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 
} 

csvファイルとして保存する方法についてthis blogを参照してください。

+0

あなたのスクリプトは**かなり高速に** **行を追加する代わりに、結果として得られる1つの大きな配列で連結する配列としてdataRange値全体を取得し、この配列を一度に宛先シートに書き込むと。 –

+0

はい、これは、彼が必要とする解決策のための外出先での簡単なコードの書き込みでした – Gerneio

+0

私は確かに理解していますが、推奨されたスクリプトが失望している典型的なケースです(データが多ければ、 )をGASのベストプラクティスを無視したユーザに提供します。だから私はここでそれを言いました。 –

関連する問題