Build a Free Social Media Scheduler With Google Sheets and Apps Script
Running a small business from a sun-soaked home office in Brisbane, or posting fresh content from a laneway studio in Melbourne, usually means juggling Instagram, LinkedIn, Facebook and X every single day. Paying for Hootsuite or Buffer each month feels wasteful when the same workflow can be replicated with tools that already sit inside your Google account. The trick is knowing how to wire Google Sheets together with Apps Script so posts fire off on time, captions stay organised, and you can finally enjoy your flat white at the local café on Brunswick Street without checking your phone every nine minutes.
This walkthrough is aimed at Aussies who would rather spend their money on a surfboard than another SaaS subscription. It assumes you have a Gmail address, can copy and paste a few lines of code, and know which accounts you actually want to publish to. Everything below is free, customisable, and lives inside a spreadsheet you control outright. If something feels too technical, drop a question in the VTU Script community forum where other Australian creators share their tweaks.
By the end of this guide, you will have a working scheduler that posts during AEST or AEDT hours, queues a week of content in advance, and pings you when something needs attention. No trial periods, no credit card prompts, and no "upgrade to unlock" banners hiding behind a modal popup.
What You Need Before You Start
Before touching a single cell, gather a few essentials. You will need a Google account with access to Sheets and Apps Script, both of which come standard with any Gmail address. A second browser tab logged into each social network you want to publish to is also handy, because the authorisation step requires you to grant access to those platforms.
You will also need an API key or app token from the social platforms themselves. Twitter and X still hand out free developer keys to individual accounts, although the approval process has become slower. Facebook and Instagram rely on a Meta Business Suite connection, which means setting up a free Meta developer app tied to a Facebook Page you manage. LinkedIn offers a similar developer programme for personal profiles and company pages. None of these services charge anything for the basic tier, which is why this whole project costs nothing beyond your existing NBN plan.
Finally, decide which timezone you want the scheduler to use. Australia runs on AEST (UTC+10) for half the year and AEDT (UTC+11) during daylight saving, which kicks in across NSW, Victoria, Tasmania, the ACT and South Australia from early October to early April. Queensland, the NT and WA stick to one offset all year. Hardcoding the wrong timezone is the fastest way to wake up at 3am to a caption about your latest product launch.
Setting Up the Spreadsheet Structure
Open a fresh Google Sheet and give it a memorable name such as "Content Queue 2026". In row one, build a header row with the following column labels: A for Date, B for Time, C for Platform, D for Caption, E for Media URL, F for Status, and G for Posted Link. Keeping everything in a single sheet makes the script easier to write and the data easier to scan.
Format column A as a Date, column B as Time, and column C as a dropdown list restricted to the platforms you intend to use. In column F, another dropdown containing values like Pending, Posted, Failed, and Skipped will help you track what actually went out. The Status column becomes your visual control panel once the system runs for a few weeks, especially when you glance at it over your morning brekkie and want to know what fired overnight.
Add a second sheet called Config. This is where you keep secrets you do not want floating in the main queue, including API keys, page IDs, and the timezone string. Treat the Config sheet like a password manager entry. Hide it from casual viewers by right-clicking the tab and choosing Hide Sheet, then protect the range so only you can edit it. If you ever collaborate with a virtual assistant based in Parramatta or Perth, lock the tab down so accidental edits do not break the whole pipeline.
Writing the Apps Script Code
Click Extensions, then Apps Script, and a new tab opens with a blank Code.gs file. The first function to write is called onEdit, which watches for changes to the Status column and triggers the posting logic. Inside this function, grab the active row, read the platform and caption, then call a helper function designed for that specific network. Each helper handles its own API authentication and POST request because the endpoints, headers and payloads differ between Twitter, Facebook, LinkedIn and the rest.
The second function worth adding is a time-driven trigger, set up via the clock icon in the Apps Script editor. Configure it to run every fifteen minutes during business hours, which balances responsiveness against Google's quota limits. Inside this trigger, loop through the main sheet, find any row where the scheduled datetime is in the past, the Status is still Pending, and the platform has a matching helper function. Posting during the run keeps the spreadsheet in sync without requiring you to press a button.
Make sure each helper function writes back to the Status column once it completes. A green "Posted" or a red "Failed" message turns the spreadsheet into a live dashboard you can scroll through during your commute on the Sydney Trains network. Capturing error messages in a separate column, or by appending them to the caption cell in square brackets, saves hours of guessing when something mysteriously breaks on a public holiday nobody told you about.
Connecting Your Social Media Accounts
Authorisation is where most beginners stall, so take it slowly. When you first run any function that touches an external API, Google prompts you to review permissions and warns that the script is unverified. Click Advanced, then Go to project (unsafe), because the warning is a standard alert that appears for every custom script, not a sign that anything is actually broken. Grant the requested scopes and the script will remember your decision for future runs.
For Meta platforms, paste your Page Access Token and Page ID into the Config sheet. The token must be long-lived, which you generate inside the Meta developer dashboard. For LinkedIn, create an app, request the w_member_social scope, and generate an access token tied to your personal profile or company page. Twitter requires an OAuth 1.0a flow or, more recently, a Bearer Token from the developer portal. Store each token in its own Config row with a label so you can rotate them when they expire.
Test every connection individually before relying on the scheduler for real content. Post a single dummy tweet, publish a test Instagram caption, and confirm the Posted Link column fills with the URL of the live post. A quick smoke test today prevents the embarrassment of a typo on Christmas Day going out to your entire audience because nobody checked that LinkedIn had silently revoked the token in October.
Automating the Schedule and Notifications
Once posting works reliably, layer in a notification system so you know when something fires or fails. Apps Script can send an email using MailApp, which is perfect for a quiet end-of-day summary listing everything that went out and anything that needs your attention. A second trigger running at 8pm AEST each evening, after the last scheduled slot has had a chance to publish, gives you a clean daily report without flooding your inbox.
For creators who live inside their phones, push the same alerts to a Telegram bot or a Discord webhook. Both services offer free, instant messaging APIs that Apps Script can hit with a simple UrlFetchApp call. A short ping that says "Posted 3/3 to Instagram today" is far more useful than yet another email buried under a Telstra billing notice. The point of automation is to reduce decisions, not introduce new ones.
Schedule a weekly review every Sunday arvo to glance at the sheet, plan the next seven days, and refill any gaps. A standing calendar reminder labelled "Content drop" keeps the habit sticky. Pair it with a simple rule that every Caption cell must include a relevant hashtag, a call to action, and a link back to your site, and the spreadsheet quietly enforces quality control on your behalf. Over a month or two, you will have a content engine that hums along in the background while you focus on the parts of the business that actually require a human being.
Open the spreadsheet right now, copy the header row from this guide, and paste it into row one. Spend an hour wiring up your first platform, schedule three posts for tomorrow, and watch them publish themselves. Share your working version, swap improvements, and learn from other builders inside the VTU Script community forum where Aussie developers post their templates every week.