You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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
}

问题原因

  1. 索引冲突:循环中直接使用i作为Index值,若原表单已有项,这些索引位置已被占用,API会判定索引无效。
  2. 索引未动态更新:批量添加项时,每新增一项会使表单总项数增加,后续项的索引应基于当前表单的实际长度,而非初始循环的固定值。

解决方案

根据需求选择以下两种方案:

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:46:07