复制提交的表单响应新表(PROJECTS)并希望能够编辑

时间:2013-11-13 19:37:30

标签: google-apps-script google-sheets

我需要帮助 - 这里有一点历史......

我有一个谷歌时间表 - https://docs.google.com/spreadsheet/ccc?key=0ArmKEmhue9OgdEFwMHBldFpGenNVdzJUQThCQU9Qcmc&usp=sharing

在该时间表中有很多表,但我希望得到帮助的是表格回复1和项目表

我有一个谷歌表格 - https://docs.google.com/forms/d/1yFy3i5H3abhFjdvchuJq2ARODcfRGo6KNkOAgeRIMMU/viewform

它与谷歌时间表相关联,每次提交数据都会在表单回复1表中显示 -

有一个应用于电子表格的脚本 -

复制到SCRIPT

/**
 * A function named onEdit will be called whenever
 * a change is made to the spreadsheet.
 * 
 * @param  {object} e The edit event (not used in this case)
 */
function onFormSubmit(e){
  var copyFromRange = 'Form Responses 1!A2:AC999';
  var copyToRangeStart = 'PROJECTS!A71:AC999';
  copyValuesOnly(copyFromRange, copyToRangeStart);
}

/**
 * This function will copy the values from a given range to
 * a second range, which starts from the given cell reference
 * 
 * @param  {string} copyFromRange    Range reference eg: 
 * @param  {string} copyToRangeStart Cell reference eg:
 */
function copyValuesOnly(copyFromRange, copyToRangeStart) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var source = ss.getRange(copyFromRange);
  source.copyTo(ss.getRange(copyToRangeStart), {contentsOnly: true});
}

这允许将数据复制到PROJECTS表,以便多个用户可以编辑和更新BUT,意识到每次提交新提交时它都会覆盖数据

还要在C&#34栏下的表格回复1表格中注明;项目编号"有一个forumula = ArrayFormula(" MC"& TEXT(行(A2:A)-1;""))我放置了允许自动为每个提交编号项目编号

我还有一个ARCHIVE脚本 -

项目最终完成后,在G"存档"如果你输入" DONE"然后它移动到ARCHIVE表

function onEdit(){

  // moves a row from a sheet to another when a magic value is entered in a column
  // adjust the following variables to fit your needs
  // see https://productforums.google.com/d/topic/docs/ehoCZjFPBao/discussion
  var sheetNameToWatch1 = "PROJECTS";
  var sheetNameToWatch2 = "ADVERTISING";
  var columnNumberToWatch = 7; // column A = 1, B = 2, etc.
  var valueToWatch = "DONE";
  var sheetNameToMoveTheRowTo = "ARCHIVE";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  if ( (sheet.getName() == sheetNameToWatch1 || sheet.getName() == sheetNameToWatch2) && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
  }
}

问题-COPYING - 使用表单输入新提交时,数据将显示在表单响应1表中,然后复制到PROJECTS表但您无法编辑PROJECTS下的数据,因为每个提交都会覆盖任何编辑并带来原始表格提交数据 -

我希望发生的是数据来自表单回复1表单,然后在每次提交时复制到PROJECTS表单,但是当新提交进入并且PROJECTS下的数据的任何更改都保留在那里时不会覆盖

问题 - 项目编号 - C表第2行下表单回复1表下的公式设置 - 每行都有一个项目编号,然后它复制到PROJECTS表,当行是archived(" DONE)并移动到ARCHIVE表格,分配给该行的项目编号与它一起使用但是当您提交新项目时,相同的编号可以应用于新项目,因此最终归档所有项目很多人会有相同的项目编号,有没有办法让每个项目都有一个独特的项目编号?

* 问题 - 提交表单* - 我不确定为什么但是当新的提交文件出现在第113行时,而不是在表单响应行的末尾?

任何帮助都会非常感激 - 我认为它会起作用,但似乎脚本不适合我想做的事情

非常感谢, Paola G

2 个答案:

答案 0 :(得分:0)

以下是基于我如何处理这种情况的一些伪步骤:

  1. onEdit触发器在对电子表格进行编辑时运行
  2. onEdit会检查您的范围以查找您要查找的值。如果值匹配,请继续执行步骤3.否则,脚本不执行任何操作。
  3. 获取值更改为您要查找的行号。
  4. 获取该行的范围,直至/包括您要停止的列。
  5. 创建一个数据(或对象),它是所有数据的副本
  6. “粘贴”(添加新行)到“已完成”的电子表格中,该电子表格是该数组(或对象)中的数据。
  7. 删除旧电子表格中的值。
  8. 然而,因为表单响应与响应电子表格紧密相关,所以在您尝试移动行时不是解决问题的最佳方法。

    事实上,我敢说你根本不应该移动 - 相反,你可以做的是复制你正在寻找“DONE”的行中的值,然后只需隐藏响应电子表格中的那一行。这样,您可以将隐藏的行视为“仍需要完成”。 完成的项目不仅会出现在响应电子表格中“存档/数据完整性”的目的,以及您可以面向公众的“已完成”电子表格等,而无需担心您的表单响应被修改。

    就我个人而言,我使用这种策略为我所在大学的外语教师安排项目预订,这大大简化了同时管理两个电子表格所需的“额外工作”。相反,只需隐藏您不需要查看的值,并将它们发布到新的电子表格中,该电子表格可以作为重要记录,同时能够编辑电子表格的布局。

    PS - 如果您没有注意到,则无法破坏响应电子表格的完整性,否则表单链接将被破坏。实际上,Google不允许您更改版面编辑以响应链接到表单的电子表格。

答案 1 :(得分:0)

感谢RiëlNotermans(Zzapps)获得了一个剧本

https://plus.google.com/u/0/116507112418725270540/posts/1i75t1wFEfh

function onFormSubmit(e){
  
 
  var responses = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form Responses 1");
  var projects =  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PROJECTS");
  var lastrow = responses.getLastRow();
  var col = responses.getLastColumn();
  var row = responses.getRange(lastrow, 1, 1, col).getValues();

  projects.appendRow(row[0]);
  //copyValuesOnly(copyFromRange, copyToRangeStart);
}

确保两张纸下面没有空行,有一些项目编号。只需确保最后一行是数据。