0

我需要帮助 - 这是一个小历史..

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

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

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

它链接到 google 时间表,每次提交时,数据都会出现在 Form Responses 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 表中,我放置了一个论坛 =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());
  }
}

问题 - 复制- 使用表单输入新提交时,数据进入表单响应 1 表,然后复制到项目表但您无法编辑项目下的数据,因为每次提交都会覆盖任何编辑并引入原始表单提交数据-

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

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

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

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

非常感谢,保拉 G

4

2 回答 2

0

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

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

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

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

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

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

于 2013-11-14T23:35:50.247 回答
0

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

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

于 2013-11-19T22:26:08.323 回答