谷歌表格中的e.values跳过空答案,是否有解决方法?

时间:2014-09-19 16:12:06

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

我有一个Google表单,它将响应数据写入包含脚本的电子表格中,该脚本应该使用他/她对表单的回答邮寄表单填充。

之前我在e.values取得了成功,邮件生成得很好。现在似乎存在一些问题,因为跳过了空答案,这意味着e.values[9]实际上变成了第9列而不是10,就像过去一样(至少在2014年春天)。因此,如果有一个或多个字段留空,则以下答案将在数组中向后移动一个或多个步骤,具体取决于留空的问题数。像这样的行为会严重破坏精心策划的脚本!

我也尝试使用namedValues,但它也不能容忍空字段!

有人知道有什么工作吗?我很欣赏这些想法。

3 个答案:

答案 0 :(得分:1)

open issue已被标记为按预期工作。那里没有帮助。

这是一个解决方法。也可在this gist中找到。

实施例

function onFormSubmit(e) {
  fixFormEvent( 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() 会将之前的二维数组转换为“一维”数组。

资源