【问题标题】:Copy submitted Form Responses to a New Sheet (PROJECTS) and wanting to be able to edit将提交的表单响应复制到新工作表(项目)并希望能够编辑
【发布时间】:2019-12-02 13:02:20
【问题描述】:

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

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

在该时间表内有许多工作表,但我希望获得帮助的是表格响应 1 和项目工作表

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

它链接到谷歌时间表,每次提交时,数据都会出现在表单响应 1 表中 -

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

复制到/从脚本

/**
 * 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 表,以便多个用户可以编辑和更新,但意识到每次新提交进入时它都会覆盖数据

还要注意,在 C 列“项目编号”下的 Form Responses 1 表中,我放置了一个 forumula =ArrayFormula("MC"&TEXT(ROW(A2:A)-1 ; "000") )允许使用项目编号自动对每个提交进行编号

我还有一个 ARCHIVE 脚本 -

一旦项目完成,如果您在 G 列“存档”下键入“完成”,它就会移动到存档表

函数 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());
  }
}

问题 - 复制 - 当使用表单输入新的提交时,数据会出现在 Form Responses 1 表中,然后复制到 PROJECTS 表但您无法在 PROJECTS 下编辑数据,因为每次提交都会覆盖任何编辑并引入原始表单提交数据 -

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

p>

问题 - 项目编号 - 表格响应 1 表下 C 列第 2 行下的公式设置 - 每一行都分配了一个项目编号,然后复制到项目表,当该行是存档(“完成)并移动到存档表分配给该行的项目编号随之而来但是当您提交新项目时,相同的编号可以应用于新项目,因此最终当您归档所有项目时,许多人将拥有相同的项目编号,有没有办法让每个项目都有唯一的项目编号?

*问题 - 提交表格 * - 我不知道为什么,但是当有新的提交进入时,数据每次都会出现在第 113 行,而不是在表单响应行的末尾?

任何帮助将不胜感激 - 我认为它会起作用,但似乎脚本不是我想要它做的正确设置

非常感谢, 保拉·G

【问题讨论】:

  • 您必须将整个内容复制到工作表PROJECTS?您不仅可以从表单中复制到达工作表Form Responses 1 的每个新条目吗?
  • 嗨,是的,我想将表单响应 1 表中的每个新条目复制到项目表中 - 可以使用脚本吗?
  • 使用脚本我认为有可能得到您需要的东西,我的建议是了解Understanding Events 中的 Google Apps Script 中提供的事件模型。
  • 谢谢您,不幸的是,这超出了我的想象-我不知道如何使用事件设置正确的脚本-这是否可以从表单响应中复制新条目到项目表,然后在提交表单时只复制一次?

标签: google-apps-script google-sheets


【解决方案1】:

这里有一些基于我如何处理这种情况的伪步骤:

  1. onEdit 触发器在对电子表格进行编辑时运行
  2. onEdit 检查您要查找的值的范围。如果值匹配,则继续执行第 3 步。否则,脚本不执行任何操作。
  3. 获取值更改为您要查找的行号。
  4. 获取该行的范围,直到/包括您要停止的任何列。
  5. 创建一个数组(或对象),它是所有数据的副本
  6. “粘贴”(添加新行)到“已完成”电子表格,即该数组(或对象)中的数据。
  7. 删除旧电子表格中的值。

但是,由于表单响应与响应电子表格密切相关,因此移动行并不是解决问题的最佳方法。

事实上,我敢说你根本不应该移动 - 相反,你可以做的是从你正在寻找“DONE”的行中复制值,然后简单地隐藏 响应电子表格中的该行。这样,您可以将 隐藏的行视为“仍需完成”,而 已完成的项目将不仅位于响应电子表格中“存档/数据完整性”目的,还可以在您的“已完成”电子表格中进行,您可以将其公开等,而无需担心您的表单响应被修改。

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

PS - 如果您没有注意到,您不能破坏 response 电子表格的完整性,否则表单链接将被破坏。事实上,Google 不允许您对链接到表单的响应电子表格进行布局更改编辑。

【讨论】:

    【解决方案2】:

    感谢 Riël Noterman (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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多