我有一个Google表单,它将响应数据写入包含脚本的电子表格中,该脚本应该使用他/她对表单的回答邮寄表单填充。
之前我在e.values
取得了成功,邮件生成得很好。现在似乎存在一些问题,因为跳过了空答案,这意味着e.values[9]
实际上变成了第9列而不是10,就像过去一样(至少在2014年春天)。因此,如果有一个或多个字段留空,则以下答案将在数组中向后移动一个或多个步骤,具体取决于留空的问题数。像这样的行为会严重破坏精心策划的脚本!
我也尝试使用namedValues
,但它也不能容忍空字段!
有人知道有什么工作吗?我很欣赏这些想法。
答案 0 :(得分:1)
open issue已被标记为按预期工作。那里没有帮助。
这是一个解决方法。也可在this gist中找到。
function onFormSubmit(e) {
fixFormEvent( e );
...
}
/**
* Force blank reponses into event object's values property, so that the value's index
* correctly reflects the question order. (With "new Sheets" + "new Forms", blank responses
* are skipped in the event object.
*
* see http://stackoverflow.com/a/26975968/1677912
*
* @param {event} e Event received as a Spreadsheet Form object. The event's value
* property will be modified by this function.
* @return {event} The same event, for chaining
*/
function fixFormEvent( e ) {
var ss = SpreadsheetApp.getActive();
var formUrl = ss.getFormUrl(); // Use form attached to sheet
var form = FormApp.openByUrl(formUrl);
var items = form.getItems();
var resp = [e.namedValues["Timestamp"]];
for (var i=0; i<items.length; i++) {
switch (items[i].getType()) {
case FormApp.ItemType.IMAGE:
case FormApp.ItemType.PAGE_BREAK:
case FormApp.ItemType.SECTION_HEADER:
// Item without a response - skip it
break;
case FormApp.ItemType.CHECKBOX:
case FormApp.ItemType.DATE:
case FormApp.ItemType.DATETIME:
case FormApp.ItemType.DURATION:
case FormApp.ItemType.GRID:
case FormApp.ItemType.LIST:
case FormApp.ItemType.MULTIPLE_CHOICE:
case FormApp.ItemType.PARAGRAPH_TEXT:
case FormApp.ItemType.SCALE:
case FormApp.ItemType.TEXT:
case FormApp.ItemType.TIME:
// If item has a response, append it to array. If not, append blank.
var itemTitle = items[i].getTitle();
var type = items[i].getType();
if (itemTitle === "") throw new Error( "Untitled item" );
var itemResp = [];
if (itemTitle in e.namedValues) {
itemResp = e.namedValues[itemTitle];
}
resp.push( itemResp );
break;
default:
Logger.log( "Unknown item type, index=" + items[i].getIndex() );
break;
}
}
e.values = resp;
return e; // For chaining
}
答案 1 :(得分:0)
可以确认此行为,并且有open issue(在此答案时)。
至于解决方法,您是否可以处理namedValues对象以确定缺少哪些值?
答案 2 :(得分:0)
使用 e.values
代替 e.range.getValues().flat()
e.range.getValues()
将返回一个数组,其中包含一个数组,其中包含记录在电子表格中的响应值)
Array.prototype.flat()
会将之前的二维数组转换为“一维”数组。
资源