谷歌表格 - 用于复制和排序表单提交数据的脚本



我正在使用Google表单创建一个电子表格,我希望按日期戳Z-A自动排序。 每当有人填写表单时,都会触发排序。

我认为这样做的方法是:

  1. 询问电子表格上是否有"表单回复的副本"...
    • 如果是,请清除所有内容...
    • 还。。。
  2. 将电子表格复制到"表单回复副本"...
  3. 根据时间戳排序

以下是我到目前为止拼凑的内容。 它仅在第一次记录响应时有效。 我不是编码员,所以任何帮助都值得赞赏。 如果有人也可以指出我带有基本语法的命令列表,我将不胜感激。

function CopySheet() {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var msheet = ss.getSheetByName("Form Responses"); 
    msheet.copyTo(ss);
    var CopySheet = ss.getSheetByName("Copy of Form Responses"); 
    CopySheet.sort(1,   false); // here 1 is for column no. 1 that 
               // is "Column A" and true is for ascending, make it 
               // false if you want descending.
};

您可以在没有脚本的情况下,通过在复制工作表中使用QUERY()来完成此操作。例如,如果您将此函数放在复制表的单元格 A1 中,并将键替换为表单响应电子表格,则最终会得到一个反向时间戳排序的响应副本:

=Query(ImportRange(spreadsheet_key,"Form Responses!A:Z"), "select * order by Col1 desc")

此数据将定期刷新(~5 分钟),因此它将反映新表单提交,但不是实时的。

注意:使用 ImportRange() 作为Query的源数据时,您需要使用ColN表示法引用查询字符串中的列。

或者,您可以在接收表单提交的电子表格中生成表单提交触发器函数,并让它将排序后的表单响应复制到您的复制表中。以下函数执行此操作。您需要将其设置为电子表格表单提交事件的触发函数。有关如何测试此类功能的信息,请参阅如何在 GAS 中测试触发功能?。

function copyFormSubmissions(e) {
  var sourceSheet = e.range.getSheet();
  var data = sourceSheet.getDataRange().getValues();
  var headers = data.splice(0,1)[0]; // remove headers from data
  data.sort(reverseTimestampOrder);  // Sort 2d array
  data.splice(0,0,headers);          // replace headers
  var destId = "--copy-sheet-ID--";
  var destSheet = SpreadsheetApp.openById(destId).getSheetByName('Sheet1');
  destSheet.clear();
  destSheet.getRange(1,1,data.length,data[0].length).setValues(data);
};
function reverseTimestampOrder(a,b) {
  // Timestamp is in first (zero-th) column
  return (b[0]-a[0]);
}

如果有人也可以指出我带有基本语法的命令列表,我将不胜感激。

Google Apps Script API 类和方法参考资料在这里。如果你正在学习,试试教程(同一个地方),我建议你通过某种形式的电子学习来熟悉Javascript - CodeAcademy.com 是一个很好的起点,因为它引入了所有语言结构而不关注网页开发,这使得它与Googls Apps Script非常相关。

最新更新