0

我正在研究一個項目,我試圖獲取工作表來自動更新來自每天新工作表的信息,以形成每週數據集合。新工作表將被放置在同一個文件夾中,並且每天都會被賦予相同的名稱。目前該過程起作用,當我將新工作表放入文件夾時,它將獲得Key ID並從該工作表導入新的唯一數據。ImportRange在已經存在的範圍的底部

我差不多完成了,最後一個問題是讓代碼不會覆蓋前一天的數據。我需要使代碼讀取表單,查看活動範圍(有多少行),然後將導入範圍函數放置在表單最後一個條目正下方的單元格中(即,如果前一天的數據結束於行166,今天的導入範圍函數繼續A:167)。

每天完成此範圍功能的最佳方法是什麼?我知道執行它可能會像爲導入範圍的變量添加+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

如果只有文件夾中曾經將一個文件時,你並不需要遍歷數組KEYID ......你可以簡單地得到第一個(只元素)通過keyID [0] ...獲取導入範圍的下一行,您可以使用s.getLastRow()。有關文檔,請參閱here。您的完整代碼將更改爲以下內容。注意第二個循環的變化。

//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

你是我的英雄! –