【问题标题】:Google scripts to copy and repeat row用于复制和重复行的 Google 脚本
【发布时间】:2017-07-18 13:30:16
【问题描述】:

大家好,我完全不擅长脚本,只需要一些帮助,我想做的是根据单元格 F 和 G 中的信息复制和重复单元格 a、b、c、d、e。

在单元格 d 和 e 中是日期,它们需要按单元格 F 中的值增加,并根据 G 中的值不断重复,我制作了一个样本表,在工作表输入上是数据,在工作表输出上显示我需要的结果。但是所有信息都需要保留在输入表上,而不是不同的表上。希望您在看到样品表时能理解我的意思。在单元格 f 的工作表上写着几周,这会比几天更好。

Title   Description     Location        Start Time      End Time     repeate every  how many times to repeat                                                                            
test    tester          here            9/7/17 20:00    9/7/17 20:10    2 weeks     4                                                                           
fake    data            home            15/7/17 15:00   15/7/17 16:00   4 weeks     3

original Google sheet

我想要达到的总体目标是能够在使用表单提交时使用脚本自动将重复发生的事件添加到 Google 日历中,但是如果我可以在工作表中重复我需要的数据,我就可以将其同步到自动日历,然后我可以根据天设置重复发生的事件,因为我相信日历的重复发生事件只让你每天每周每周做一次..

或者谁能给我指出一个网站,我可以找到一些信息来帮助我吗?

【问题讨论】:

  • 谁能给我指出一个网站,我可以找到一些信息来帮助我吗?

标签: google-apps-script google-sheets


【解决方案1】:

我将重复更改为几天而不是几周。

function repeatingEvents() 
{
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var sht=ss.getSheetByName('Repeat');
    var rng=sht.getDataRange();//Get all of the data on the sheet
    var rngA=rng.getValues();
    var day=86400000;//milliseconds in a day
    var week=604800000;//millisecond in a week
    for(var i=0;i<rngA.length;i++)
    {
      if(rngA[i][6]>0)//If the number of repeats is greater than zero
      {
        var cnt=Number(rngA[i][6]);//cnt is number of repeats
        for(var n=0;n<cnt;n++)
        {
          var row=[];
          row.push(rngA[i][0]);//column A
          row.push(rngA[i][1]);//column B
          row.push(rngA[i][2]);//column C
          row.push(new Date(rngA[i][3].getTime() + (rngA[i][5] * (n + 1) * day)));//old date time plus repeat duration * repeat count * milliseconds in a day in column D
          row.push(new Date(rngA[i][4].getTime() + (rngA[i][5] * (n + 1) * day)));//column E
          row.push(rngA[i][5]);//Column F
          row.push('');//column G get zeroed out so script won't come back and do it again without human interaction
          sht.appendRow(row);//add new event
         }
         sht.getRange(i+1,7).setValue(0);//zero out initial number of repeats because I use this to determine when repeats are required
      }
    }
    sht.getRange(2,1,sht.getLastRow(),sht.getLastColumn()).sort({column:4,ascending:true});//Sort Spreadsheet by starting date
}

这是我的电子表格的样子。

好的,我更改了代码以适应您最近添加 id 的更改。它已经在您的电子表格中,我在这里重复一遍。供参考。

function repeatingEvents() 
{
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var sht=ss.getSheetByName('input');
    var rng=sht.getDataRange();//Get all of the data on the sheet
    var rngA=rng.getValues();
    var day=86400000;//milliseconds in a day
    var week=604800000;//millisecond in a week
    for(var i=0;i<rngA.length;i++)
    {
      if(rngA[i][7]>0)//If the number of repeats is greater than zero
      {
        var cnt=Number(rngA[i][7]);//cnt is number of repeats
        for(var n=0;n<cnt;n++)
        {
          var row=[];
          row.push(rngA[i][0]);//A
          row.push(rngA[i][1]);//B
          row.push(rngA[i][2]);//C
          row.push(new Date(rngA[i][3].getTime() + (rngA[i][6] * (n + 1) * day)));//old date time plus repeat duration * repeat count * milliseconds in a day D
          row.push(new Date(rngA[i][4].getTime() + (rngA[i][6] * (n + 1) * day)));//E
          row.push(rngA[i][5]);//F
          row.push(rngA[i][6]);//G
          row.push('');//H
          sht.appendRow(row);//add new event
         }
         sht.getRange(i+1,8).setValue(0);//zero out initial number of repeats because I use this to determine when repeats are required
      }
    }
    sht.getRange(2,1,sht.getLastRow(),sht.getLastColumn()).sort({column:4,ascending:true});//Sort Spreadsheet by starting date
}

【讨论】:

  • 很好用,非常感谢,如果你有时间解释每个部分,请做,如果不是问题,我也想学习..
  • 检查 cmets。我评论了亮点。这不是很复杂。
  • 谢谢你的帮助,有没有办法在这个函数结束后调用另一个函数,或者我只需要在触发器上设置它们?
  • 您可以将新函数调用放在此脚本的末尾。但请记住,这两个脚本都必须在 6 分钟或更短的时间内完成。
  • 好的,谢谢,下一个脚本是将其全部发送到 Google 日历,接下来我将尝试检查结束日期,如果结束日期已经过去,则移动它排到另一张纸上,但应该更容易弄清楚如何做到这一点,再次感谢。
【解决方案2】:

我已将 F 和 G 列更改为 G 和 H,我尝试编辑脚本以使用它,除了添加重复的天数之外,所有似乎都可以工作,它仍然将它们添加到 F 而不是 G 似乎不能找出原因?

function repeatingEvents() 
{
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var sht=ss.getSheetByName('Calendar');
    var rng=sht.getDataRange();//Get all of the data on the sheet
    var rngA=rng.getValues();
    var day=86400000;//milliseconds in a day
    var week=604800000;//millisecond in a week
    for(var i=0;i<rngA.length;i++)
    {
      if(rngA[i][7]>0)//If the number of repeats is greater than zero
      {
        var cnt=Number(rngA[i][7]);//cnt is number of repeats
        for(var n=0;n<cnt;n++)
        {
          var row=[];
          row.push(rngA[i][0]);//A
          row.push(rngA[i][1]);//B
          row.push(rngA[i][2]);//C
          row.push(new Date(rngA[i][3].getTime() + (rngA[i][6] * (n + 1) * day)));//old date time plus repeat duration * repeat count * milliseconds in a day D
          row.push(new Date(rngA[i][4].getTime() + (rngA[i][6] * (n + 1) * day)));//E
          row.push(rngA[i][5]);//E This needs to be here other wise 6 and 7 become 5 & 6
          row.push(rngA[i][6]);//F
          row.push(rngA[i][7]);//G
          sht.appendRow(row);//add new event
         }
         sht.getRange(i+1,8).setValue(0);//zero out initial number of repeats because I use this to determine when repeats are required
      }
    }
    sht.getRange(2,1,sht.getLastRow(),sht.getLastColumn()).sort({column:4,ascending:true});//Sort Spreadsheet by starting date
}

【讨论】:

  • 我看到了你的 cmets,我猜你在 E 和 F 之间添加了一列。所以我修改了附加到重复行的行。看看我对脚本的编辑。我还添加了列字母。我只是将新列 F 中的任何内容复制回附加行的该列中。如果您在其他位置添加了新列,请在电子表格中进行更改,以便我为您做出适当的更正。
  • 您在哪里添加了添加的列,这是我在添加到 google 日历时添加的用于 id 的列,但这是一个需要更改的大量脚本,我不太了解,我只是尝试在此脚本完成后运行 Calender 脚本,但将脚本设置为每小时运行一次可能会更容易,除非您有任何建议,再次感谢您的帮助,我非常感谢您的帮助。
  • 如果您查看我发布的原始 Google 表格,您将看到我在运行脚本时得到的输出,即使我更改脚本以尝试对齐,我也必须遗漏一些东西它仍然将重复的天数放在 F 列中。
  • 感谢该部分现在一切正常,我已将同步到日历脚本中添加到我在这里找到的链接表中,它开始工作正常但现在停止工作,我收到错误在第 337 行,我发现错误是因为我添加了额外的 3 列(G、H 和 I),但不知道如何修复它,如果你有时间请看一下,第 41 行是 cal id但我删除了 ID、G、H 列,我不需要同步到日历,再次感谢。
  • 我不熟悉该脚本,也许您应该就该错误联系作者或将其作为另一个问题提交。该网站上可能还有其他人知道该脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2016-09-27
  • 2021-12-02
  • 2018-03-09
  • 1970-01-01
  • 2020-02-22
  • 2014-06-21
相关资源
最近更新 更多