从表单响应中收集字符串对象

时间:2017-10-24 19:11:03

标签: google-apps-script google-sheets google-apps google-form

我是Google Apps脚本和Java的新手,从MS Office VBA迁移。我已经做了一些研究,但仍然需要帮助。

我已经设置了两个表格来控制我公司的设备运动。当您将设备从存储中取出时必须填写其中一个,而另一个必须在返回时填写。因此,我设置了一个onFormSubmit触发器来切换特定电子表格上的每个设备状态,以便概述所拍摄和返回的内容。

但是,我无法使用触发器功能上的'e'参数找到一种方法。我花了一些时间尝试解决这个问题,我确实提出了一个不太好的解决方案:使用表单响应查看电子表格,阅读最后一行并将信息分开以完成我需要的工作。最大的问题是我通过这种方式发现了一些不稳定性,因为有时带有响应的电子表格需要一些时间来更新。无论如何,这是我现在为“设备清除表”提供的代码:

function onFormSubmit(e) {

  Utilities.sleep(30000); // I put this to try to minimize the Spreadsheet update problem

  var ds = SpreadsheetApp.openById("storage-control-sheet-id").getSheetByName("Control");
  var os = SpreadsheetApp.openById("form-responses-sheet-id").getSheetByName("Form Responses 1");
  var val = os.getRange(os.getLastRow(), 10, 1, 14).getValues().toString(); // holds data from region with the equipments names
  var responsavel = os.getRange(os.getLastRow(), 4).getValue().toString(); // holds the name of the person in charge of equipment
  var motivo = os.getRange(os.getLastRow(), 3).getValue().toString(); // holds the reason for using the equipment
  var prevret = os.getRange(os.getLastRow(), 6).getValue(); // holds the date for returning the equipment
  var table = ds.getRange("B3:B149").getValues(); // holds a list with equipment names
  var output = ds.getRange("C3:F149").getValues(); // holds current info at the Storage Control Spreadsheet
  // now working with the data collected...
  var arr = [];
  var indexes = []; // collect the lines that need to change on the ds object
  val = val.split(",");
  for (var i = 0; i<val.length; i++){
    if (val[i].toString()!=="") {
      arr.push(val[i].trim());
    }
  }

  for (var i = 0; i<table.length;i++){
    if (arr.indexOf(table[i][0]) >= 0) {
      indexes.push(i); //checking which lines on 'output' should change 
    }
  }
  for (var i = 0; i<indexes.length; i++) {
    output[indexes[i]][0] = "In use";
    output[indexes[i]][1] = responsavel;
    output[indexes[i]][2] = motivo;
    output[indexes[i]][3] = prevret;
  }

  ds.getRange("C3:F149").setValues(output);
  SpreadsheetApp.flush();
}

从我在这里看到的,如果我能得到一个带有某些问题答案的字符串对象,从事件参数'e',并将其存储在'val'变量中,那就可以了。如何直接从“e”访问答案,而不是转到“回复电子表格”?任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

您可以直接从事件中获取值,方法是引用其值&#34;值&#34;或者&#34; namedValues&#34;属性,在此处记录:https://developers.google.com/apps-script/guides/triggers/events#form-submit

   e.values
   e.namedValues

namedValues是一个将表单字段名称映射到响应值的对象。

values是一个数组,其中的响应按照它们在电子表格中显示的顺序排列。