Added code to sync Google Sheets folder periodically
This commit is contained in:
parent
87cfcc1c8b
commit
2c21a0ac4e
112
test-sync-sheets.js
Normal file
112
test-sync-sheets.js
Normal file
@ -0,0 +1,112 @@
|
||||
const { google } = require('googleapis');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const axios = require('axios');
|
||||
|
||||
// Set the path to the Google service account key file
|
||||
const keyFilePath = path.join(__dirname, 'config' ,'*.json');
|
||||
|
||||
// Set the ID of the Google Drive folder to sync
|
||||
const folderId = '';
|
||||
|
||||
// Set the local directory path to sync the folder to
|
||||
const localDirectory = path.join(__dirname, 'data');
|
||||
|
||||
async function waitForAPI() {
|
||||
while (true) {
|
||||
try {
|
||||
await axios.get('http://0.0.0.0:3000/helloworld'); // Adjust the URL based on your API's endpoint
|
||||
break;
|
||||
} catch (error) {
|
||||
console.log('API is not running yet. Retrying in 5 seconds...');
|
||||
await new Promise((resolve) => setTimeout(resolve, 5000));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function downloadFile(drive, fileId, filePath) {
|
||||
const dest = fs.createWriteStream(filePath);
|
||||
const res = await drive.files.export({
|
||||
fileId,
|
||||
mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // MIME type for Google Sheets
|
||||
}, { responseType: 'stream' });
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
res.data
|
||||
.on('end', () => {
|
||||
console.log(`Downloaded file: ${filePath}`);
|
||||
resolve();
|
||||
})
|
||||
.on('error', (err) => {
|
||||
console.error(`Error downloading file: ${filePath}`, err);
|
||||
reject(err);
|
||||
})
|
||||
.pipe(dest);
|
||||
});
|
||||
}
|
||||
|
||||
async function syncFolder(drive, folderId, localPath) {
|
||||
// List all files and subfolders in the folder
|
||||
const res = await drive.files.list({
|
||||
q: `'${folderId}' in parents and trashed = false`,
|
||||
fields: 'files(id, name, mimeType)',
|
||||
});
|
||||
|
||||
const items = res.data.files;
|
||||
|
||||
// Create the local folder if it doesn't exist
|
||||
if (!fs.existsSync(localPath)) {
|
||||
fs.mkdirSync(localPath);
|
||||
}
|
||||
|
||||
// // Iterate over files and subfolders
|
||||
for (const item of items) {
|
||||
const { id, name, mimeType } = item;
|
||||
const itemPath = `${localPath}/${name}`;
|
||||
|
||||
if (mimeType === 'application/vnd.google-apps.folder') {
|
||||
console.log(`Ignoring folder ${itemPath}`)
|
||||
// Synchronize subfolders recursively
|
||||
//await syncFolder(drive, id, itemPath);
|
||||
} else {
|
||||
// Download files
|
||||
await downloadFile(drive, id, itemPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function runSync() {
|
||||
try {
|
||||
// Load the Google service account credentials
|
||||
const keyFileContent = fs.readFileSync(keyFilePath);
|
||||
const credentials = JSON.parse(keyFileContent);
|
||||
|
||||
// Create an authentication instance
|
||||
const auth = new google.auth.GoogleAuth({
|
||||
credentials,
|
||||
scopes: ['https://www.googleapis.com/auth/drive.readonly'],
|
||||
});
|
||||
|
||||
// Authorize with the Google Drive API
|
||||
const authClient = await auth.getClient();
|
||||
|
||||
// Create a Google Drive API instance
|
||||
const drive = google.drive({ version: 'v3', auth: authClient });
|
||||
|
||||
await syncFolder(drive, folderId, localDirectory); // Update with the path to your local folder
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error during sync:', error);
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
await waitForAPI();
|
||||
while (true) {
|
||||
await runSync();
|
||||
console.log('Waiting for next sync...');
|
||||
await new Promise((resolve) => setTimeout(resolve, 60000)); // Delay between syncs (in milliseconds)
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
Loading…
Reference in New Issue
Block a user