【问题标题】:Adding a row and copying the information from the original row for every day in a date range in Google Sheets #2在 Google Sheets #2 的日期范围内添加一行并从原始行复制信息
【发布时间】:2017-07-30 04:02:02
【问题描述】:

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

Sample Document

【问题讨论】:

  • 我认为最好保留与表单链接的工作表。不要用它做任何事情。这是保存您的提交的好地方。当您收到表单提交时,然后使用 onFormSubmit 触发器将新行附加到另一个工作表。我打电话给我的 ResponseReview。然后你可以用它做任何你想做的事情,因为所有新数据都将被附加到底部。你怎么看?你想这样做吗?
  • 无论您认为什么是最简单的解决方法,我都愿意。只要让我知道该怎么做,我就会摆脱你的头发。共享文件是一个副本,因此欢迎您做任何您认为最好的事情,我会按照您的指示处理原件。谢谢

标签: date google-sheets range


【解决方案1】:

您将需要创建一个表单提交事件并将以下代码附加到它。您还需要创建一个工作表名称“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';
}

这是我的电子表格在运行扩展函数之前的样子:

之后:

现在您可以保留与表单链接的工作表,并将其作为提交数据的存档。

【讨论】:

  • @Saket 感谢有关使用 slice() 按值传递数组的信息。
  • 我讨厌这种愚蠢的感觉!尝试按照您的指示并收到错误:'TypeError:无法从未定义中读取属性“值”。 (第 5 行,文件“代码”)'。这是实际电子表格的链接。请发挥你的魔力,然后我将取消分享并尝试学习...docs.google.com/spreadsheets/d/…
  • 你不能直接运行这个函数function formSubmitEvent1(e) { var ss=SpreadsheetApp.openById('1Pq_jlzMMvKY99HGc9iFrxjXshkZc2lb4Vde0YsFQc-c'); var sht=ss.getSheetByName('ResponseReview'); sht.appendRow(e.values); }。您必须将其连接到 onFormSubmit 触发器。如果没有触发器,它们就没有事件,因此 event.values 是未定义的。 e参数代表事件对象。
  • 运行 onOpen() 对其进行授权并获得一个 mytools 菜单。然后运行 ​​convertRangeToRows 函数来授权它,它应该在 ResponseReviews 上发挥它的魔力。我现在只是将当前数据复制到该表中。
  • 另外我应该提一下,当您连接到表单提交触发器时,首先将通知设置为立即,然后在出现问题时您会收到更快的消息。如果一切顺利,则返回并将通知设置为其他选项之一。它有助于节省服务器带宽,我们都必须尽自己的一份力量让其他人更好地工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多