0

私は、毎週新しいシートからの情報を使ってシートを自動更新して週単位のデータ集計を作成しようとしているプロジェクトに取り組んでいます。新しいシートは同じフォルダにドロップされ、毎日同じ名前が付けられます。現在のところ、このプロセスは機能し、フォルダに新しいシートをドロップすると、キーIDが取得され、そのシートから新しいユニークなデータがインポートされます。既に存在している範囲の下にあるImportRange

私はほとんど終わりました。私の最後の問題は、コードが前日のデータを上書きしないようにすることです。私は、コードがシートを読み込み、アクティブな範囲(何行あるか)を見て、シート上の最後のエントリの直下のセルにimportrange関数を配置するようにする必要があります(つまり、前日のデータが行166、今日のインポート範囲関数はA:167になります)。

毎日この範囲機能を達成する最良の方法は何ですか?私はそれを実行することはおそらくimport範囲の変数に+1を加えることと同じくらい簡単だろうが、どのようにこの範囲の読み取り関数を達成することができますか? getRangeはトリックを行うか、行番号と関係がある特定のものがありますか?ここで

はコードです:

//trigger from user action upload new sheet 
// get sheet key from new sheet 
//specify new cell in monthly for import range 
// put new key in import range function in sheet 
//execute import range 
//var counter = 0; 



//var import= "IMPORTRANGE""(""1K7Rj4QK-EVjf8lZ0BSew7iDeCtktqWjzgjoaVPe5jSc""," "sheet1!A1:G6"")" 

var counter = 0; 

function test() { 
    var files = []; 
    var keyID = []; 

function searchFolder() { 
var folderId = '0B6wmHZ5c0fzfTjI1bFpKOHI3N3M'; // test folder 
    // Log the name of every file in the folder. 
    var filesN = DriveApp.getFolderById(folderId).getFiles(); //log files in folder 
    while (filesN.hasNext()) { 
    var file = filesN.next(); 
    keyID.push(file.getId()) 
    files.push(file.getName()); 
    } 
    Logger.log(keyID) 

    var ss = SpreadsheetApp.openById("1lH9Y12P2Q2OFndIJoAU48ePggXFc9WGcWjolZMcABoc");  //defines target spreadsheet ie monthly 
    SpreadsheetApp.setActiveSpreadsheet(ss); //sets target spreadsheet as active 
    var s = ss.getSheetByName('Sheet1'); 
    for (var i = 0; i < keyID.length; i++) { 
     var range = s.getRange(1,i+1); //sets range in target. ONLY CHOOSE ONE 
     range.setValue('=IMPORTRANGE("'+keyID[i]+'","sheet1!A1:167")') 
    } 
    autoUpdate(keyID); 
} 

function autoUpdate(){ //updates monthly from newly imported daily 
    if (counter == 1){ //counter is made to be 1 when day is uploaded to monthly 
var ss = SpreadsheetApp.openById("1lH9Y12P2Q2OFndIJoAU48ePggXFc9WGcWjolZMcABoc"); //defines target spreadsheet ie monthly 
SpreadsheetApp.setActiveSpreadsheet(ss); //sets target spreadsheet as active 
var range= ss.getRange("A1:A1"); //sets range in target. ONLY CHOOSE ONE CELL FOR IMPORTRANGE- IF MORE THAN 1 IS CHOSEN YOU WILL GET A #REF ERROR BECAUSE IT WILL PUT IMPORTRANGE IN ALL CELLS 
range.activate; // activates range 
//range.setValue('=IMPORTRANGE("1hVv6ldHEaCCI_uptr0MpzAyP60x7on8YR_brWwWXTWo","sheet1!A1:167")'); 
    range.setValue(('=IMPORTRANGE("'+keyID+'","sheet1!A1:167")'));//Puts in IMPORTRANGE into target as a STRING value (just words). Once it hits the sheet, then SHEETS executes IMPORTRANGE not SCRIPTS. In Source sheet, range is selected to import to target (ie A1:G6) 
counter=(counter-1) 
    } 
} 

function timeStamp(){ 
    if (files == "Daily") { 
    counter= (counter+1) 
    } 
} 

searchFolder(); 
timeStamp(); 
autoUpdate(); 

} 
+0

複数のimporrangeを単一の数式で連結することができます。あなたはそれを使ってあなたの事件を解決することができます。 http://stackoverflow.com/q/38924637/2213940 –

答えて

0

フォルダ内の1つのファイルには、鍵IDの配列をループする必要はありません一度しかがある場合...あなたは、単に最初の(とのみを取得することができます要素)をkeyID [0]で指定します。インポート範囲の次の行を取得するには、s.getLastRow()を使用します。ドキュメントについては、hereを参照してください。完全なコードは次のように変更されます。 2番目のループがあった場所の変更を確認します。

//trigger from user action upload new sheet 
// get sheet key from new sheet 
//specify new cell in monthly for import range 
// put new key in import range function in sheet 
//execute import range 
//var counter = 0; 



//var import= "IMPORTRANGE""(""1K7Rj4QK-EVjf8lZ0BSew7iDeCtktqWjzgjoaVPe5jSc""," "sheet1!A1:G6"")" 

var counter = 0; 

function test() { 
    var files = []; 
    var keyID = []; 

    function searchFolder() { 
    var folderId = '0B6wmHZ5c0fzfTjI1bFpKOHI3N3M'; // test folder 
    // Log the name of every file in the folder. 
    var filesN = DriveApp.getFolderById(folderId).getFiles(); //log files in folder 
    while (filesN.hasNext()) { 
     var file = filesN.next(); 
     keyID.push(file.getId()) 
     files.push(file.getName()); 
    } 
    Logger.log(keyID) 

    var ss = SpreadsheetApp.openById("1lH9Y12P2Q2OFndIJoAU48ePggXFc9WGcWjolZMcABoc");  //defines target spreadsheet ie monthly 
    SpreadsheetApp.setActiveSpreadsheet(ss); //sets target spreadsheet as active 
    var s = ss.getSheetByName('Sheet1'); 
    s.getRange(s.getLastRow()+1,1).setValue('=IMPORTRANGE("'+keyID[0]+'","sheet1!A1:167")') 

    autoUpdate(keyID); 
    } 

    function autoUpdate(){ //updates monthly from newly imported daily 
    if (counter == 1){ //counter is made to be 1 when day is uploaded to monthly 
     var ss = SpreadsheetApp.openById("1lH9Y12P2Q2OFndIJoAU48ePggXFc9WGcWjolZMcABoc"); //defines target spreadsheet ie monthly 
     SpreadsheetApp.setActiveSpreadsheet(ss); //sets target spreadsheet as active 
     var range= ss.getRange("A1:A1"); //sets range in target. ONLY CHOOSE ONE CELL FOR IMPORTRANGE- IF MORE THAN 1 IS CHOSEN YOU WILL GET A #REF ERROR BECAUSE IT WILL PUT IMPORTRANGE IN ALL CELLS 
     range.activate; // activates range 
     //range.setValue('=IMPORTRANGE("1hVv6ldHEaCCI_uptr0MpzAyP60x7on8YR_brWwWXTWo","sheet1!A1:167")'); 
     range.setValue(('=IMPORTRANGE("'+keyID+'","sheet1!A1:167")'));//Puts in IMPORTRANGE into target as a STRING value (just words). Once it hits the sheet, then SHEETS executes IMPORTRANGE not SCRIPTS. In Source sheet, range is selected to import to target (ie A1:G6) 
     counter=(counter-1) 
    } 
    } 

    function timeStamp(){ 
    if (files == "Daily") { 
     counter= (counter+1) 
    } 
    } 

    searchFolder(); 
    timeStamp(); 
    autoUpdate(); 

} 
+0

あなたは私のヒーローです! –

関連する問題