appsmithorg/appsmith · error · AppsmithPluginException

PE-GSH-5000

PE-GSH-5000

Error message

Missing a valid response object.

What it means

Thrown in RowsUpdateMethod.transformExecutionResponse when the response JsonNode is null. Code GSheetsPluginError.QUERY_EXECUTION_FAILED (PE-GSH-5000). Same root cause class as error 265 but on the Update path: the upstream PUT to sheets.googleapis.com returned an empty body or the reactive chain delivered Mono.empty() to the transformer. Message: MISSING_VALID_RESPONSE_ERROR_MSG.

Source

Thrown at app/server/appsmith-plugins/googleSheetsPlugin/src/main/java/com/external/config/RowsUpdateMethod.java:241

        uriBuilder.queryParam("valueInputOption", "USER_ENTERED");
        uriBuilder.queryParam("includeValuesInResponse", Boolean.TRUE);

        final List<String> objects = new ArrayList<>(rowObject.getValueMap().values());

        return webClient
                .method(HttpMethod.PUT)
                .uri(uriBuilder.build(true).toUri())
                .body(BodyInserters.fromValue(Map.of(
                        "range", methodConfig.getSpreadsheetRange(),
                        "majorDimension", "ROWS",
                        "values", List.of(objects))));
    }

    @Override
    public JsonNode transformExecutionResponse(
            JsonNode response, MethodConfig methodConfig, Set<String> userAuthorizedSheetIds) {
        if (response == null) {
            throw new AppsmithPluginException(
                    GSheetsPluginError.QUERY_EXECUTION_FAILED, ErrorMessages.MISSING_VALID_RESPONSE_ERROR_MSG);
        }

        return this.objectMapper.valueToTree(Map.of("message", "Updated sheet successfully!"));
    }

    private RowObject getRowObjectFromBody(JsonNode body) {

        if (body.isArray()) {
            throw new AppsmithPluginException(
                    AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, ErrorMessages.EXPECTED_ROW_OBJECT_MESSAGE);
        }

        if (body.isEmpty()) {
            throw new AppsmithPluginException(
                    AppsmithPluginError.PLUGIN_EXECUTE_ARGUMENT_ERROR, ErrorMessages.EMPTY_UPDATE_ROW_OBJECT_MESSAGE);
        }

View on GitHub (pinned to 8cd9021c24)

Solutions

  1. Check server logs for the underlying HTTP status of the PUT /values/{range} call.
  2. Re-authorize the datasource (OAuth refresh).
  3. Inspect proxy config for body stripping on non-2xx.
  4. Confirm the row was actually written by re-reading the sheet - the update may have succeeded but the response was lost.
  5. Report to Appsmith: update path should treat null response as a structured execution failure with the upstream status, not just 'missing response'.
Defensive patterns

Strategy: try-catch

Try / catch

UpdateRow.run({
  onSuccess: (response) => {
    if (!response) {
      showAlert('Update returned no response; verify the row actually updated by re-reading the sheet', 'warning');
      return;
    }
    showAlert('Updated successfully', 'success');
  },
  onError: (err) => showAlert(err.message, 'error'),
});

Prevention

When it happens

Trigger: Update succeeded at Google's side but the response body was lost in transit; an OAuth token expired mid-flight so the gateway returned empty; a self-hosted proxy stripped the body.

Common situations: Token refresh race; reverse proxy buffering issues; intermittent upstream 5xx where the plugin's error mapping returned empty instead of the error.

Related errors


AI-assisted analysis of appsmithorg/appsmith@8cd9021c24 (2026-08-12). Data as JSON: /api/errors/9305557dc05eae8b. Report an issue: GitHub.