Google Forms and Sheets can be used for entering and storing data in the cloud from Node Red applications. In this example a Form is used to register the Movement activity from a PIR attached to a Raspberry Pi. The data is kept in Google Sheets and accessed by Charts.
Open Google Forms directly (or via Google Docs) from Google Apps in the Chrome browser and create a new form. Title it e.g. HA PIR then click on the Untitled Question box and change Option 1 from Multiple Choice to Short Answer using the drop down list. Change form name (top left ) to HA PIR by clicking on it. The Untitled Question is renamed Movement.
Move from Questions tab to Responses. Click the Sheets icon to Create Spreadsheet. The form is now linked to the Spreadsheet HA PIR (Responses) which opens in a new Chrome tab and contains the Form Responses sheet. The sheet is renamed 'responses'.
Return to the HA PIR tab in Chrome. Click the More icon next to Send, and select Get pre-filled link.
Type in Your answer e.g. activity, then click Get link and Copy link to clipboard.
In Notepad change the text "viewForm" in the link to "formResponse" and replace "activity" with "{{payload}}".
The modified link can now be used as the URL in the GET http request node of NODE RED to return a UTF-8 string.
The Google Timeline Chart in Sheets by default displays continuous lines through the recorded movement response events, however what is needed are just point markers at the times of the movement. The line can be interrupted by recording a timeline event with the absence of a movement value, and with small intervals between the recorded movement and non-movement the movement events appear as point markers.
The "activity" in the URL link for the http request node of Node Red is replaced with "{{payload}}". The payload to the http request node is a string format containing either "1" or an empty string (if a number format were used then an empty number would be interpreted as a 0, which is not what is required).The Timeline Chart is set to a maximum value of 2 so that the points are displayed centrally. The timestamps for the recorded events is automatically provided by the Form response, and the data is recorded in the Sheet "responses". The data in the Sheet responses is to be displayed in the Timeline Chart.
It's more useful to automatically sort the form responses so that last entry is shown at top of the Spreadsheet.
Add another Sheet to the Spreadsheet. Since we are only interested in the Timestamp of when the movement occurred, in cell A1 of the new Sheet , enter
=sort(QUERY(responses!A:B,"select A,B where B=1",1),1,false) .
so that the timestamps with no movement are removed. The sheet will be populated automatically with new form responses with the most recent at the top.
This could be further refined by limiting to just the most recent 15 by entering the following into cell A1
=sort(QUERY(responses!A:B,"where B=1 offset "&countIF(responses!B:B,1)-17),1,false) .
The objective is to list the most recent movements by Day of Month and Time, such that the Day of Month is not replicated in the listing and appears topmost in the list.
The format strings dd mmm ddd in cell D2 and hh:mm in cell D3 are used for formatting the Day of Month and Time , respectively. A table is created using text(TO_DATE((A2)),$E$2) and =text(TO_DATE((A2)),$D$2) . The final table manipulates the previous table to remove the duplicate Day of Months and keep the last entry topmost in the list =if(countif($E$2:$E2,E2)>1,,E2) . The data in the final table can be used for Table Chart for inclusion in the Node Red dashboard. While the data in the Responses sheet is used for the Timeline Chart.
Ah, that clarifies the exact roadblock. You are referring to Google Sheets' built-in Timeline Chart feature failing with strict validation errors (such as "Each values column may be followed by... Column is of type date/string" or failing to render altogether). [1]
No, Google has not updated the legacy Timeline Chart to fix this vulnerability. Instead, Google effectively replaced it by rolling out a completely new, native feature called Timeline View. [2]
The original error you encountered as of May 2023 happens because the old "Timeline Chart" gadget heavily relies on a strict, fragile structure: Column 1 must be a Date, Column 2 must be Text, and Column 3 must be a Numeric Value (with optional strict annotation headers). If Node-RED inserts a timestamp formatted incorrectly (like a plain string instead of a serial date number), or if a blank row/null value passes through, the entire canvas instantly crashes with a non-descriptive error. [1, 3]
To use Google Sheets' modern and fully functional replacement, your data must be structured to match the rules of the new engine:
Format Your Columns in Sheets: Ensure your sheet has columns named precisely for clarity: [Timestamp/Date], [Sensor Type (Topic)], and [Reading Value].
Convert Text to Dates: When Node-RED appends rows, it often pushes dates as standard text string formats (e.g., 2026-10-12T16:45:00). Google Sheets charts will reject this. In your Node-RED function node before writing to Google Sheets, make sure you push a clean JavaScript Date or use Google's local formatting: [4, 5]
// Force a proper date object string that Sheets can parse safely
msg.payload = [ new Date().toLocaleString(), msg.topic, msg.payload ];
return msg;
Use "Timeline View" instead of "Timeline Chart":
In your Google Sheet, select your clean columns.
Go to the top menu and click Insert > Timeline.
This generates a dedicated, modern, highly interactive, and completely scrollable timeline sheet that natively allows zooming into specific hours, days, weeks, or months without crashing. [1, 2]
The Best Alternative for FlowFuse Dashboard
Google has not fixed this slider bug. The underlying JavaScript package that drives those legacy interactive timeline chart sliders has been neglected in favor of their newer cloud infrastructure.
If you are trying to build a FlowFuse Dashboard, you don't need Google's buggy client-side sliders. FlowFuse Dashboard natively embeds ApexCharts, which has a robust, modern timeline slider engine.
You can use the exact same two-column structure (Timestamp and Number) from your Node-RED nodes:
Stream your Matter payload into a Function node to construct an explicit coordinate object:
msg.payload = {
x: new Date().getTime(), // Millisecond Epoch timestamp
y: msg.payload // Temperature or Humidity numeric reading
};
msg.topic = "Matter Sensor";
return msg;
Pass this straight into the FlowFuse ui-chart widget.
In the widget options, set the chart type to Line or Area. ApexCharts inside FlowFuse handles native drag-to-zoom and timeline panning out-of-the-box, operating smoothly without crashing or freezing.
If your ultimate goal is displaying this inside your FlowFuse Dashboard, embedding a Google Sheet can still feel sluggish due to continuous page iframe reloads.
Since you are already using Node-RED, the most robust architecture is bypassing Google Sheets for rendering:
Use Node-RED to stream data into Google Sheets purely to keep a permanent backup log.
At the same time, route that exact data payload directly into FlowFuse Dashboard's ui-chart node. By sending data straight to ui-chart, you take advantage of its internal backend (ApexCharts), giving you fluid, native pinch-to-zoom and timeline scrolling right out of the box without worrying about Google API breaks.
[2] https://support.google.com
Select the Chart to publish and in the top right click on the ellipsis, from the drop down select Publish Chart.
From the popup menu select the Embed Tab with Interactive.
Copy the iframe for use in Node Red template node.