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
- Check server logs for the underlying HTTP status of the PUT /values/{range} call.
- Re-authorize the datasource (OAuth refresh).
- Inspect proxy config for body stripping on non-2xx.
- Confirm the row was actually written by re-reading the sheet - the update may have succeeded but the response was lost.
- 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
- Re-authorize the datasource if OAuth tokens expire frequently.
- After an opaque null-response, re-List the rows to confirm whether the update landed.
- Watch server logs for the upstream PUT status.
- Verify the proxy is not stripping response bodies.
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.