2017-04-24 55 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

再次感谢,将探讨。另外,我想实际设置它,只要在输入表中添加一个新行,此函数就会删除所有现有数据,并用多行的所有新数据替换它。或者,我应该使用任何方法/方向拿这个 - 会非常有帮助! –