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

时间:2017-01-12 18:17:14

标签: javascript google-sheets archive

所以我开始说我刚开始学习Javascript 4天前。现在我已经开始使用这个脚本。

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

我希望每周发生这种情况,并且对于每个只有1周回复而创建的存档表单。这应该是星期日上午12点01分到凌晨1点到凌晨,在这个小时内发生的事情并不重要。

我还想删除主要收集表中的所有响应(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 个答案:

答案 0 :(得分:0)

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

让我们一步一步地完成这些功能并进行优化。

首先,您已经获得了所有行,如果您想要所有数据,只需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);
}

最后,您可以通过转到资源>来安排它。当前项目触发并设置基于时间的触发器。