表单在脚本

时间:2018-04-07 07:21:17

标签: google-apps-script

我有一张由费用表填充的表格。

每次提交表单时,都会在电子表格中创建一个新行。

我还有一个小脚本,我在本月的第一天运行,在同一张纸上添加几行(一些不需要我使用表格的常规费用)。

一切正常。

问题是,在我运行脚本(向工作表添加大约5行)之后,当我返回表单并提交它时。新条目被放在脚本之前。

所以:

1) Submit expenses form -> new entry in row 2.
2) submit expenses form -> new entry in row 3.
3) run script -> new entries in rows 4,5,6,7,8,9
4) submit expenses form -> new entry in row 4. Rows 4,5,6,7,8,9 shift down one

有人可以提供建议吗?

2 个答案:

答案 0 :(得分:2)

为什么会这样?

实际上,我认为谷歌表单会在内部跟踪插入响应的最后一行编号。因此,下次它可以决定将新响应放在何处。

因此,当您手动[通过脚本]在工作表中输入数据而不是通过谷歌表格时,谷歌表格行号的计数器不会更新,而且不知道您插入了一些数据,所以它试图将数据插入它记得的相同位置。

希望这对你有所帮助,至少在某种程度上可以帮助你。

如何解决这个问题?

正如另一个答案所述,解决你的情况;您可以使用FormService将您的数据作为“表单回复”提交,因此谷歌表格内部计数器也会增加它的数量。一切都在同步。

答案 1 :(得分:1)

由于您的脚本没有对数据进行任何操作,只是简单地向表单添加重复值,因此请使用Forms Service将数据直接作为回复提交到表单。使用这种方法,如果您将表单与表单断开连接,则费用将全部存在于表单响应中。

function addRecurringExpenses() {
  var form = FormApp.openById("FORM_ID");

  // Create an array of objects where each object represents one of your recurring expenses.
  // The key-value pairs correspond to the questions in the fom
  var recurringExpenses = [{"question1": "1-response1", "question2": "1-response2", "question3": "1-response3"},
                           {"question1": "2-response1", "question2": "2-response2", "question3": "2-response3"},
                           {"question1": "3-response1", "question2": "3-response2", "question3": "3-response3"}]
  var questions = form.getItems(); // Get all of the questions in the form
  for (var i=0; i<recurringExpenses.length; i++) { // Loop through the recurring expense
    var response = form.createResponse(); // Create a new response that will house all of the answers for this one expense

    var question1 = questions[0].asTextItem(); // Not all questions are "TextItems" – https://developers.google.com/apps-script/reference/forms/
    var answer1 = question1.createResponse(recurringExpenses[i]["question1"]);

    var question2 = questions[1].asTextItem();
    var answer2 = question2.createResponse(recurringExpenses[i]["question2"]);

    var question3 = questions[2].asTextItem();
    var answer3 = question3.createResponse(recurringExpenses[i]["question3"]);

    // Add each answer to the response object
    response.withItemResponse(answer1).withItemResponse(answer2).withItemResponse(answer3);
    response.submit(); // Submit the response to the form
  }
}