使用网格项创建响应不起作用,它期望什么响应?

Create response with grid item is not working, what responses is it expecting?

我正在使用 google 表格来跟踪工作现场的进度,它会更新传播sheet,然后 'Summary' sheet 会获取最新的信息并根据进度为某些单元格的背景着色。在 'Summary' sheet 每一行的开头,我有一个 URL 链接到适当的表格。 URL 随每个新条目更新为预填充的 URL,这样一旦表单打开,最后一个条目的数据就已经输入了。在我切换到 'grid' 样式表单问题之前,它一直很好用。当预填充的 URL 函数尝试从网格项创建响应时,我收到错误消息。

PS:非常感谢 u/Mogsdad 的 'evenBetterBuildUrl' 功能。

///////............Rebuild URL for Next Update...........
function evenBetterBuildUrls(ss, logSheet, curRoomData) {
  var lastRow = logSheet.getLastRow() - 1;
  var lastClmn = logSheet.getLastColumn(); 

  var data =  curRoomData;
  var headers = logSheet.getRange(1, 1, 1, lastClmn).getValues();

  var formUrl = ss.getFormUrl();             
  var form = FormApp.openByUrl(formUrl);

  var items = form.getItems();
  var urlCol = lastClmn;

var response = form.createResponse();
for (var i=0; i<items.length; i++) {

  var ques = items[i].getTitle();           // Get text of question for item
  if (ques == 'Notes:') {
    var quesCol = headers[0].indexOf(ques, i);
  } else {
    var quesCol = headers[0].indexOf(ques);      // Get col index that contains this question
  }
  var resp = ques ? data[quesCol] : "";
  var type = items[i].getType().toString();


  switch (items[i].getType()) {
    case FormApp.ItemType.TEXT:
      var item = items[i].asTextItem();
      break;
    case FormApp.ItemType.PARAGRAPH_TEXT: 
      item = items[i].asParagraphTextItem();
      resp = '';
      break;
    case FormApp.ItemType.LIST:
      item = items[i].asListItem();
      break;
    case FormApp.ItemType.MULTIPLE_CHOICE:
      item = items[i].asMultipleChoiceItem();
      break;
    case FormApp.ItemType.CHECKBOX:
      item = items[i].asCheckboxItem();
      // In a form submission event, resp is an array, containing CSV strings. Join into 1 string.
      // In spreadsheet, just CSV string. Convert to array of separate choices, ready for createResponse().
      if (typeof resp !== 'string')
        resp = resp.join(',');      // Convert array to CSV
      resp = resp.split(/ *, */);   // Convert CSV to array
      break;
    case FormApp.ItemType.DATE:
      var item = items[i].asDateItem();
      resp = new Date( resp );
      break;
    case FormApp.ItemType.DATETIME:
      item = items[i].asDateTimeItem();
      resp = new Date( resp );
      break;
    case FormApp.ItemType.SCALE:
      var item = items[i].asScaleItem();
      resp = parseInt(resp);
      break;
    case FormApp.ItemType.GRID:
      var item = items[i].asGridItem();                  

      if (typeof resp !== 'string') {
        resp = resp.join(',');      // Convert array to CSV
      }
      resp = resp.split(/ *, */);   // Convert CSV to array
      break;
    default:
      item = null;  // Not handling DURATION, IMAGE, PAGE_BREAK, SECTION_HEADER, TIME
      break;
  }
  // Add this answer to our pre-filled URL
  if (item) {
    var respItem = item.createResponse(resp);
    response.withItemResponse(respItem);
  }
  // else if we have any other type of response, we'll skip it
  else Logger.log("Skipping i="+i+", question="+ques+" type:"+type);
}
// Generate the pre-filled URL for this row
var editResponseUrl = response.toPrefilledUrl();
// If there is a "Prefilled URL" column, update it
if (urlCol >= 0) {
  var urlRange = logSheet.getRange(lastRow+1,urlCol).setValue(editResponseUrl);
}
  return editResponseUrl;

};

我遇到了类似的问题,我无法在您的代码中实现它,但我写了这个,并且可以正常工作。 GridItem 期望具有定义值的字符串数组,当某些值为空时,它必须为空值。该代码是我如何使用它的示例。电子表格中的空单元格是空字符串类型,但您需要为空。希望对你有帮助。

var formItem = items[18].asGridItem();
var respArray = [row[28]!=="" ? row[28] : null, row[29]!=="" ? row[29] : null];
var response = formItem.createResponse(respArray);      
formResponse.withItemResponse(response);