{"id":281778,"date":"2026-03-01T14:44:48","date_gmt":"2026-03-01T14:44:48","guid":{"rendered":"https:\/\/en-ca.wordpress.org\/plugins\/gsheet-sftp-sync\/"},"modified":"2026-03-01T14:44:43","modified_gmt":"2026-03-01T14:44:43","slug":"sftp-sync-for-google-sheets","status":"publish","type":"plugin","link":"https:\/\/tah.wordpress.org\/plugins\/sftp-sync-for-google-sheets\/","author":14492344,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.5.0","stable_tag":"1.5.0","tested":"6.9.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"SFTP Sync for Google Sheets","header_author":"Olivier Bigras","header_description":"Receive Google Sheets exports via API and upload to SFTP server. Automate daily syncs from Google Sheets to your server.","assets_banners_color":"212121","last_updated":"2026-03-01 14:44:43","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/olivierbigras.com","header_plugin_uri":"https:\/\/github.com\/bigrat95\/sftp-sync-for-google-sheets\/","header_author_uri":"https:\/\/olivierbigras.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":183,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.0":{"tag":"1.5.0","author":"bigrat95","date":"2026-03-01 14:44:43"}},"upgrade_notice":{"1.5.0":"<p>WordPress.org initial release with improved security and code quality.<\/p>","1.4.0":"<p>Renamed plugin for WordPress.org compliance. Fixed escaping and sanitization issues.<\/p>","1.3.1":"<p>WordPress.org plugin directory compliance fixes.<\/p>","1.3.0":"<p>Fixes CSV header detection in WP All Import. Re-copy the Google Apps Script after updating.<\/p>","1.2.0":"<p>Security improvements: Better password encryption and API rate limiting.<\/p>","1.1.0":"<p>New export settings! Configure schedule, filename mode, and format directly in the plugin.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3472111,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3472111,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3472111,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3472111,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3472111,"resolution":"3","location":"assets","locale":""}},"screenshots":{"1":"Plugin settings page with API endpoint information and SFTP server configuration","2":"Export settings with schedule, filename mode, and format options","3":"Activity logs and Google Apps Script code generator"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[569,567,25296,10757,1558],"plugin_category":[],"plugin_contributors":[256856],"plugin_business_model":[],"class_list":["post-281778","plugin","type-plugin","status-publish","hentry","plugin_tags-automation","plugin_tags-csv","plugin_tags-google-sheets","plugin_tags-sftp","plugin_tags-sync","plugin_contributors-bigrat95","plugin_committers-bigrat95"],"banners":{"banner":"https:\/\/ps.w.org\/sftp-sync-for-google-sheets\/assets\/banner-772x250.png?rev=3472111","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sftp-sync-for-google-sheets\/assets\/icon-256x256.png?rev=3472111","icon_2x":"https:\/\/ps.w.org\/sftp-sync-for-google-sheets\/assets\/icon-256x256.png?rev=3472111","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sftp-sync-for-google-sheets\/assets\/screenshot-1.png?rev=3472111","caption":"Plugin settings page with API endpoint information and SFTP server configuration"},{"src":"https:\/\/ps.w.org\/sftp-sync-for-google-sheets\/assets\/screenshot-2.png?rev=3472111","caption":"Export settings with schedule, filename mode, and format options"},{"src":"https:\/\/ps.w.org\/sftp-sync-for-google-sheets\/assets\/screenshot-3.png?rev=3472111","caption":"Activity logs and Google Apps Script code generator"}],"raw_content":"<!--section=description-->\n<p>SFTP Sync for Google Sheets allows you to automatically export Google Sheets and upload them to any SFTP server. Use cases include:<\/p>\n\n<ul>\n<li>Daily inventory updates from Google Sheets<\/li>\n<li>Automated data feeds for e-commerce<\/li>\n<li>Syncing spreadsheet data to your server<\/li>\n<li>Backing up Google Sheets to your own server<\/li>\n<\/ul>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Easy Setup<\/strong> \u2013 Configure everything from the WordPress admin<\/li>\n<li><strong>Secure API<\/strong> \u2013 Auto-generated API keys protect your endpoint<\/li>\n<li><strong>REST API Endpoint<\/strong> \u2013 Receives files from Google Apps Script<\/li>\n<li><strong>SFTP Upload<\/strong> \u2013 Automatically uploads to your SFTP server<\/li>\n<li><strong>Activity Logs<\/strong> \u2013 Track all uploads and errors<\/li>\n<li><strong>Pre-built Script<\/strong> \u2013 Copy-paste Google Apps Script included<\/li>\n<li><strong>No paid services required<\/strong> \u2013 Uses Google Apps Script and your SFTP server<\/li>\n<\/ul>\n\n<p><strong>How It Works:<\/strong><\/p>\n\n<ol>\n<li>Install and activate the plugin<\/li>\n<li>Configure your SFTP credentials in Settings<\/li>\n<li>Copy the provided Google Apps Script to your Sheet<\/li>\n<li>Set up a daily trigger in Google Apps Script<\/li>\n<li>Your sheet automatically syncs to your SFTP server<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>sftp-sync-for-google-sheets<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Go to Settings \u2192 SFTP Sync<\/li>\n<li>Enter your SFTP server credentials<\/li>\n<li>Click \"Test SFTP Connection\" to verify<\/li>\n<li>Copy the Google Apps Script from the settings page<\/li>\n<li>Paste into your Google Sheet (Extensions \u2192 Apps Script)<\/li>\n<li>Run <code>setupTrigger()<\/code> to enable daily exports<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20sftp%20libraries%20are%20supported%3F\"><h3>What SFTP libraries are supported?<\/h3><\/dt>\n<dd><p>The plugin supports both the PHP ssh2 extension and phpseclib. If neither is available, you can install phpseclib via Composer.<\/p><\/dd>\n<dt id=\"are%20there%20any%20costs%3F\"><h3>Are there any costs?<\/h3><\/dt>\n<dd><p>This solution uses Google Apps Script and your existing SFTP server. No third-party paid services are required.<\/p><\/dd>\n<dt id=\"can%20i%20export%20as%20xlsx%20instead%20of%20csv%3F\"><h3>Can I export as XLSX instead of CSV?<\/h3><\/dt>\n<dd><p>Yes! Change <code>EXPORT_FORMAT: 'csv'<\/code> to <code>EXPORT_FORMAT: 'xlsx'<\/code> in the Google Apps Script configuration.<\/p><\/dd>\n<dt id=\"how%20do%20i%20change%20the%20export%20schedule%3F\"><h3>How do I change the export schedule?<\/h3><\/dt>\n<dd><p>In the Google Apps Script, change <code>SCHEDULE: 'daily'<\/code> to <code>SCHEDULE: 'hourly'<\/code> for hourly exports, or modify <code>DAILY_HOUR<\/code> to change the time.<\/p><\/dd>\n<dt id=\"is%20the%20api%20secure%3F\"><h3>Is the API secure?<\/h3><\/dt>\n<dd><p>Yes. All requests require a valid API key. The key is auto-generated on activation and can be regenerated anytime.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20with%20multiple%20google%20sheets%3F\"><h3>Can I use this with multiple Google Sheets?<\/h3><\/dt>\n<dd><p>Yes! Each Google Sheet can have its own Apps Script. They can all point to the same WordPress endpoint.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>WordPress.org initial release<\/li>\n<li>Improved code quality based on plugin review feedback<\/li>\n<li>Moved log storage to wp-content\/uploads for better security<\/li>\n<li>Updated WordPress compatibility to 6.9<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Renamed plugin to \"SFTP Sync for Google Sheets\" for WordPress.org compliance<\/li>\n<li>Fixed all escaping issues (using esc_html_e, esc_html__ throughout)<\/li>\n<li>Fixed input sanitization for $_SERVER variables<\/li>\n<li>Updated text domain to sftp-sync-for-google-sheets<\/li>\n<li>Removed promotional language from descriptions<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Removed hidden files (.htaccess) for WordPress.org plugin directory compliance<\/li>\n<li>Logs directory now protected by index.php only (no .htaccess needed)<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Fixed CSV export: Now uses Google's native CSV export instead of manual CSV building<\/li>\n<li>This fixes WP All Import not recognizing CSV headers<\/li>\n<li>CSV output is now identical to Google Sheets \"File &gt; Download &gt; CSV\"<\/li>\n<li>Updated generated Google Apps Script code<\/li>\n<li>Updated WordPress compatibility to 6.9<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Security: Improved password encryption using AES-256-CBC with WordPress salts<\/li>\n<li>Security: Added rate limiting (60 requests\/minute) to prevent API abuse<\/li>\n<li>Added composer.json for easier phpseclib dependency management<\/li>\n<li>Added index.php security files to prevent directory listing<\/li>\n<li>Updated WordPress compatibility to 6.7<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added Export Settings section in admin<\/li>\n<li>New schedule options: Daily or Hourly<\/li>\n<li>New filename mode: Dated (unique files) or Overwrite (same file each time)<\/li>\n<li>Configurable base filename and export format (CSV\/XLSX)<\/li>\n<li>Apps Script now auto-configured with plugin settings<\/li>\n<li>Improved SFTP error messages for debugging<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>SFTP upload via ssh2 or phpseclib<\/li>\n<li>REST API endpoint for receiving files<\/li>\n<li>Admin settings page<\/li>\n<li>Activity logging<\/li>\n<li>Google Apps Script generator<\/li>\n<\/ul>","raw_excerpt":"Automatically receive Google Sheets exports and upload them to your SFTP server. Supports daily automated syncs.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/281778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=281778"}],"author":[{"embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bigrat95"}],"wp:attachment":[{"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=281778"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=281778"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=281778"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=281778"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=281778"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tah.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=281778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}