每周在新工作表中复制和存档表单响应的 Google 脚本

Posted

技术标签:

【中文标题】每周在新工作表中复制和存档表单响应的 Google 脚本【英文标题】:Google Script to copy and archive Form Responses in New Sheet on Weekly Basis 【发布时间】:2017-01-12 18:17:13 【问题描述】:

所以我先说我 4 天前才开始学习 javascript。现在已经不碍事了,我打算写这个脚本。

我想自动化将收集在电子表格中的 Google 表单回复移动到与存档相同的工作簿中的新工作表的过程。

我希望每周进行一次,并且对于创建的每个存档表只有 1 周的响应。这应该在周日的凌晨 12:01 到凌晨 1:00 之间,发生在那个小时内真的没关系。

我还想从主要收集表 (Current_Responses) 中删除所有这些响应,但如果我以后必须手动删除这些响应,这很好(而且可能很好,因为这样我可以查看脚本是否正常工作) .

我觉得我在这方面有一个很好的开端,但由于我对这一切都是新手,如果有经验更丰富的脚本编写者可以查看我的代码并告诉我这是否会按照我的意图工作,我将不胜感激它到,如果不是,错误在哪里以及如何纠正它们。我很乐意犯错误,然后从中吸取教训,因此任何建议都会受到尊重。

我研究了三个网站上的多个主题和脚本,以帮助将其整合在一起。提前感谢您的任何帮助和建议!

// function to copy from Current_Responses to new sheet 'Archived_Responses
//(UTC Date)' placed after Current_Responses
function CreateCopySheetWeekly() 

  //source info
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = ss.getSheetByName('Current_Responses');
  var range = ss.getRange ('A:I'); //replace column length as needed
  var data = range.getValues ();

  //creates target sheet to copy responses to
  var ts = 'Archived_Responses '+formatDate();
  ss.insertSheet(sheetName, ss.getSheets().length, template: templateSheet);
  ts.getRange(ts.getLastRow()+1, 1, data.length, data[0].length).setValues(data);

//end of primary function

//function to determine and format UTC Date for CreateCopySheetWeekly function
function formatDate() 
  var month, day, d = new Date();
  month = ('0'+(d.getUTCMonth()+1)).slice(-2);
  day = ('0'+(d.getUTCDate()).slice(-2);
  return d.getUTCFullYear()+'-'+month+'-'+day;

//end of date function

//check every hour to determine when to perform newSheetLast function. Intended for Sunday
//between 0001-0100
window.setInterval (onSunday()
  var today = new Date();
  if (today.getDay() == 0 && today.getHours() === 12) 
  CreateCopySheetWeekly();
, 600000);

对我不感冒,因为我是新手,但建设性的批评永远不会伤害任何人。

【问题讨论】:

【参考方案1】:

如果您每周运行一次,我们可以做一个简化的假设,即您希望所有响应每周备份一次,然后清除主响应表。

让我们一步一步的浏览功能并优化它。

首先,您已经获得了所有行,如果您想要所有数据,您只需 getDataRange() 即可,而不必担心扩展。 我们也不需要实际数据。

function CreateCopySheetWeekly() 

  //source info
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = ss.getSheetByName('Current_Responses'); // Current Responses
  var range = ss.getDataRange();

formatDate() 只是在创建当前日期的 ISO8601 表示,如果我理解正确的话,您可以删除该函数并改为使用

var ts = 'Archived_Responses '+ new Date().toISOString().slice(0,10);

带有模板的插入表已经复制了所有数据,所以您只需要

ss.insertSheet(ts, ss.getSheets().length, template: templateSheet);

然后我们要清理我们的主要响应表。 如果我们只是清除范围,表单将继续追加到我们从未清除过的最后一行之后,因为它会记住它得到了多少响应,所以我们需要删除除标题之外的所有行。

templateSheet.deleteRows(2, range.getNumRows() - 1);

制作最终脚本

function CreateCopySheetWeekly() 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var templateSheet = ss.getSheetByName('Current_Responses'); 
  var range = ss.getDataRange(); 
  var ts = 'Archived_Responses '+ new Date().toISOString().slice(0,10);

  ss.insertSheet(ts, ss.getSheets().length, template: templateSheet);
  templateSheet.deleteRows(2, range.getNumRows() - 1);

最后,您可以通过转到 Resources > Current Project's Triggers 并设置基于时间的触发器来安排它。

【讨论】:

以上是关于每周在新工作表中复制和存档表单响应的 Google 脚本的主要内容,如果未能解决你的问题,请参考以下文章

将行从一个选项卡复制并删除到另一个选项卡

使用 Google 表单更新现有的 Google 表格

COUNTIF文本查询在Google工作表中具有偏移量

Google Spanner - 如何将数据复制到另一个表?

Google脚本:从文档生成电子邮件会丢失格式

在使用具有剪切和粘贴功能的Apps脚本时,如何处理Google表单中的新数据?