Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌脚本每周在新表单中复制和归档表单响应_Javascript_Google Sheets_Archive - Fatal编程技术网

Javascript 谷歌脚本每周在新表单中复制和归档表单响应

Javascript 谷歌脚本每周在新表单中复制和归档表单响应,javascript,google-sheets,archive,Javascript,Google Sheets,Archive,所以我首先要说我4天前才开始学习Javascript。现在,这已经不成问题了,我打算用这个剧本 我想自动将收集在电子表格中的Google表单响应移动到与归档文件位于同一工作簿中的新工作表中 我希望这种情况每周发生一次,对于创建的每个只有1周回复的归档表。这应该是在周日的12:01-1:00之间,在这段时间内,这真的不重要 我还想从主收集表(当前的_响应)中删除所有这些响应,但是如果我以后必须手动删除这些响应,那就可以了(而且可能很好,因为这样我可以检查脚本是否正常工作) 我觉得我在这方面已经有了

所以我首先要说我4天前才开始学习Javascript。现在,这已经不成问题了,我打算用这个剧本

我想自动将收集在电子表格中的Google表单响应移动到与归档文件位于同一工作簿中的新工作表中

我希望这种情况每周发生一次,对于创建的每个只有1周回复的归档表。这应该是在周日的12:01-1:00之间,在这段时间内,这真的不重要

我还想从主收集表(当前的_响应)中删除所有这些响应,但是如果我以后必须手动删除这些响应,那就可以了(而且可能很好,因为这样我可以检查脚本是否正常工作)

我觉得我在这方面已经有了一个非常坚实的开始,但由于我对所有这些都是新手,如果一个更有经验的脚本编写者能够检查我的代码并告诉我这是否能按我的预期工作,如果不能,错误在哪里以及如何纠正错误,我将非常感激。我很乐意犯错误,然后从中吸取教训,所以任何建议都会得到深深的尊重

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

// 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);

因为我是新手,所以请对我宽容一些,但建设性的批评从来不会伤害任何人。

如果你每周运行一次,我们可以简化假设,即你希望每周备份一次所有回复,然后清除主要回复表

让我们一步一步地浏览函数并对其进行优化

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

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

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

让我们一步一步地浏览函数并对其进行优化

首先,您已经获得了所有行,如果您需要所有数据,您只需
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);
}
最后,您可以通过转到资源>当前项目的触发器并设置基于时间的触发器来安排它