使用Google Form API v1更新表单时遇location.index无效错误
Google Forms API v1 创建表单项报错:
create_item.location.index is invalid or was not provided 问题场景
使用Google Forms API v1更新现有表单时,已在CreateItemRequest中填写Location字段,但仍收到服务器错误提示:create_item.location.index is invalid or was not provided。相关代码如下:
func UpdateForm(formId string, form *forms.Form) *forms.Form { var requestElements []*forms.Request // 更新表单信息 requestElements = append(requestElements, &forms.Request{ UpdateFormInfo: &forms.UpdateFormInfoRequest{ Info: form.Info, UpdateMask: "*", }, }) // 添加表单项 for i, item := range form.Items { element := &forms.Request{ CreateItem: &forms.CreateItemRequest{ Item: item, Location: &forms.Location{Index: int64(i)}, }, } requestElements = append(requestElements, element) } request := forms.BatchUpdateFormRequest{ IncludeFormInResponse: true, Requests: requestElements, } response, err := formService.Forms. BatchUpdate(formId, &request). Context(context.TODO()). Do() if err != nil { panic(err) } return response.Form }
问题原因
- 索引冲突:循环中直接使用
i作为Index值,若原表单已有项,这些索引位置已被占用,API会判定索引无效。 - 索引未动态更新:批量添加项时,每新增一项会使表单总项数增加,后续项的索引应基于当前表单的实际长度,而非初始循环的固定值。
解决方案
根据需求选择以下两种方案:
方案1:追加新项到表单末尾
先获取原表单的现有项数,将新项依次追加到末尾:
func UpdateForm(formId string, form *forms.Form) *forms.Form { // 获取原表单的现有项数 existingForm, err := formService.Forms.Get(formId).Context(context.TODO()).Do() if err != nil { panic(err) } existingItemCount := len(existingForm.Items) var requestElements []*forms.Request // 更新表单信息 requestElements = append(requestElements, &forms.Request{ UpdateFormInfo: &forms.UpdateFormInfoRequest{ Info: form.Info, UpdateMask: "*", }, }) // 追加新项到表单末尾 for i, item := range form.Items { element := &forms.Request{ CreateItem: &forms.CreateItemRequest{ Item: item, // 基于原表单项数计算插入位置 Location: &forms.Location{Index: int64(existingItemCount + i)}, }, } requestElements = append(requestElements, element) } request := forms.BatchUpdateFormRequest{ IncludeFormInResponse: true, Requests: requestElements, } response, err := formService.Forms. BatchUpdate(formId, &request). Context(context.TODO()). Do() if err != nil { panic(err) } return response.Form }
方案2:替换原表单所有项
先删除原表单的所有现有项,再插入新项:
func UpdateForm(formId string, form *forms.Form) *forms.Form { // 获取原表单信息 existingForm, err := formService.Forms.Get(formId).Context(context.TODO()).Do() if err != nil { panic(err) } var requestElements []*forms.Request // 更新表单信息 requestElements = append(requestElements, &forms.Request{ UpdateFormInfo: &forms.UpdateFormInfoRequest{ Info: form.Info, UpdateMask: "*", }, }) // 从后往前删除所有现有项(避免索引偏移) for i := len(existingForm.Items) - 1; i >= 0; i-- { requestElements = append(requestElements, &forms.Request{ DeleteItem: &forms.DeleteItemRequest{ ItemId: existingForm.Items[i].ItemId, }, }) } // 插入新项,此时表单无现有项,可直接使用循环索引 for i, item := range form.Items { element := &forms.Request{ CreateItem: &forms.CreateItemRequest{ Item: item, Location: &forms.Location{Index: int64(i)}, }, } requestElements = append(requestElements, element) } request := forms.BatchUpdateFormRequest{ IncludeFormInResponse: true, Requests: requestElements, } response, err := formService.Forms. BatchUpdate(formId, &request). Context(context.TODO()). Do() if err != nil { panic(err) } return response.Form }
内容的提问来源于stack exchange,提问作者Đỗ Xuân Anh
相关产品推荐
相关产品推荐

