2017-07-30 66 views
-1

我有一个Google表格,Google表格中的信息被转储。其中两列创建一个日期范围(C列和G列),我希望工作表为每个范围的日期自动创建一行新的信息,并复制原始行中的所有其他信息创建。最后,范围中的每个日期都有它自己的行,不管它是2天还是25天,并且通过表单收集的所有信息每天都会出现。如果G列中没有日期,则只有一天的行程,并且不需要额外的行。当有人提交表单时,为了让事情变得更加困难,信息将被输入到最后一行填充的行的正下方,因此这些由日期范围填充的新行将需要放在表单中,可能从行2000开始,或者更多的是因为这张表在几个月内会有很多信息。正如您在示例中看到的那样,工作簿中还有另一张表单执行所有排序。谢谢你的帮助。在Google表格中添加一行并复制日期范围内每天在原始行中的信息#2

Sample Document

+0

我认为最好留下与表单单独关联的工作表。不要对它做任何事情。这是一个保存提交内容的好地方。当你得到一个表单提交,然后使用onFormSubmit触发器将新行附加到另一个工作表。我打电话给我的ResponseReview。那么你可以用它来做任何你想做的事情,因为所有的新数据都会被追加到底部。你怎么看?你想这样做吗? – Cooper

+0

无论你认为最简单的修复方法如何,我都可以做到。只要让我知道该怎么做,我会摆脱你的头发。共享文件是一个副本,因此欢迎您采取任何您认为最适合的方式,并且我会按照您在原始文件上的指导。谢谢 –

回答

0

您将需要创建一个表单提交事件,下面的代码附加到它。您还需要创建一个表格名称'ResponseReview'。

function formSubmitEvent1(e) 
{ 
    var ss=SpreadsheetApp.openById('SpreadsheetID'); 
    var sht=ss.getSheetByName('ResponseReview'); 
    sht.appendRow(e.values); 
} 

上述代码将需要openById方法中的SpreadsheetId。此代码将在ResponseReview表的末尾附加任何新行。

下面的代码将展开第3列和第7列中具有日期的任何主体,它也将从第一行中删除列7中的结束日期。我使用的事实是,如果列3不是空的,列7不是,列7不等于列3,那么这是一个需要扩展的行。所以我必须删除结束日期,以便在将来再次运行时不会继续扩展。如果你需要保持结束日期,我们可以找出其他的东西。我们可以在最后添加一个不扩展列。

function convertRangetoRows() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var sht=ss.getSheetByName('ResponseReview'); 
    var rng=sht.getDataRange(); 
    var rngA=rng.getValues(); 
    var rngB=[]; 
    var day=86400000; 
    rngB.push(rngA[0]); 
    for(var i=1;i<rngA.length;i++) 
    { 
    rngB.push(rngA[i]); 
    if(rngA[i][2] && rngA[i][6] && rngA[i][2]!=rngA[i][6]) 
    { 
     var row=rngA[i].slice();//returns a new copy of the array by value 
     rngA[i][6]='';//deletes the end date by reference so it also deletes the one thats already been pushed into rngB 
     var dt0=new Date(row[2]); 
     var dt1=new Date(row[6]); 
     var days=(dt1.valueOf()-dt0.valueOf())/day; 
     var dt=dt0.valueOf(); 
     for(j=0;j<days;j++) 
     { 
     dt+=day; 
     row[2]=Utilities.formatDate(new Date(dt), Session.getScriptTimeZone(), "MM/dd/yyyy");//original array unchanged 
     row[6]='';//original array unchanged 
     rngB.push(row.slice());//push in a copy 
     } 
    } 
    var intermediate='nothing'; 
    } 
    var outrng=sht.getRange(1,1,rngB.length,rngB[0].length); 
    outrng.setValues(rngB); 
    var end='the end is near'; 
} 

这是我的电子表格看起来运行扩展功能之前:

enter image description here

后:

enter image description here

现在你可以离开挂片单独的形式,并让它成为提交数据的档案。

+0

@Saket感谢有关使用slice()按值传递数组的信息。 – Cooper

+0

我讨厌这种愚蠢!试图按照你的指示,并得到一个错误:'TypeError:无法从undefined读取属性“值”。 (第5行,“代码”文件)。这里是实际电子表格的链接。请工作你的魔术,然后我会取消共享并尝试学习... https://docs.google.com/spreadsheets/d/1Pq_jlzMMvKY99HGc9iFrxjXshkZc2lb4Vde0YsFQc-c/edit?usp = sharing –

+0

你无法运行此功能函数formSubmitEvent1(e) { var ss = SpreadsheetApp.openById('1Pq_jlzMMvKY99HGc9iFrxjXshkZc2lb4Vde0YsFQc-c'); var sht = ss.getSheetByName('ResponseReview'); sht.appendRow(e.values);直接。您必须将其挂接到onFormSubmit触发器。没有触发器,它们不是事件,所以event.values是未定义的。 e参数表示事件对象。 – Cooper

相关问题