2017-04-24 54 views
-1

我試圖在Google表單顯示板的後端創建自動化功能,以使我可以輕鬆縮放創建的某個報表。基於1行輸入生成多行數據 - Google表格

基本上,我想根據在某個地方完成的1行輸入生成多行數據。這基本上是關於每月或每季重複發生的經常性收入和經常性費用。因此,多行的生成應基於「經常性月份時間」,「經常性收入」和「經常性費用」。最主要的是在這裏添加日期 - 按照它不斷重複的時間量。循環和重複應繼續,直到2019-2020年的決定日期等爲止(說2019年1月1日)

下面的詳細示例中,輸入表由個人完成 - 而輸出表由腳本自動生成,代碼和公式

Example Input and output tables


希望這清楚地解釋了我的問題發言。我認爲我們必須在這裏使用「Google Apps腳本」從輸入語句創建循環。

任何方法和幫助解決這個問題將不勝感激。

回答

1

這是一些代碼,它應該做的伎倆。

function generateReccuringExpenses(){ 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var inputSheet = ss.getSheetByName("Input Table"); 
    var outputSheet = ss.getSheetByName("Output Table"); 
    var endYear = 2020; 

    // We considere your data to be on a sheet with a header, starting on A1 cell 
    var data = inputSheet.getRange(2, 1, inputSheet.getLastRow()-1, inputSheet.getLastColumn()).getValues(); 

    for(var i = 0; i < data.length; i++){ 

    var row = data[i]; 

    if(row[3] > 0){ 

     var elements = new Array(); 
     var d = new Date(row[0]); 

     while(d.getFullYear() < endYear){ 

     var test = d.getFullYear(); 
     var month = d.getMonth() +1; 
     var dateString = month+"/"+d.getDate()+"/"+d.getFullYear(); 
     var newRow = [dateString, row[1],row[2]]; 
     elements.push(newRow); 

     var n = d.getMonth() + row[3]; 

     if(n > 11){ 

      d.setMonth(n -11); 
      d.setYear(d.getYear() + 1); 

     } 
     else{ 

      d.setMonth(n); 

     } 

     } 

     var outputRange = outputSheet.getRange(outputSheet.getLastRow()+1, 1, elements.length, outputSheet.getLastColumn()); 
     outputRange.setValues(elements); 

    } 

    } 

    var range = outputSheet.getRange(2, 1, outputSheet.getLastRow()+1, outputSheet.getLastColumn()); 
    range.sort(1); // Sort by date (column 1) 

} 

您可以使用Range.sort()方法或使用Spreadsheet工具對結果進行排序。

+0

非常感謝皮埃爾 - 它的工作!很快 - 是否有可能改變輸入表和輸出表的位置,如B20,E20等?如果是的話 - 哪些功能。 (begin api!) –

+0

在上面的代碼中,我使用[Sheet.getRange(startRow,startCol,numRows,numCols)](https://developers.google.com/apps-script/reference/spreadsheet/sheet#getRange(Integer,Integer,Integer,Integer))方法,但可以使用[Sheet.getRange(A1notation)](https://developers.google.com/apps-script/reference/spreadsheet/sheet# getRange(String))方法 –

+0

再次感謝,將探討。另外,我想實際設置它,只要在輸入表中添加一個新行,此函數就會刪除所有現有數據,並用多行的所有新數據替換它。或者,我應該使用任何方法/方向拿這個 - 會非常有幫助! –