File size: 4,350 Bytes
9f49b1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
const { google } = require('googleapis');
const { v4: uuidv4 } = require('uuid');

// Replace with your Google Sheets ID and Sheet Name
const spreadsheetId = '1_TJeEsTmen7vMDQCpVckyRGVhlfdSnR-FCLnjyNuSck';
const sheetName = 'Sheet1';

async function getGoogleSheetsClient() {
    const auth = new google.auth.GoogleAuth({
        keyFile: 'credentials.json', // Update the path to your credentials
        scopes: ['https://www.googleapis.com/auth/spreadsheets'],
    });

    const client = await auth.getClient();
    const googleSheets = google.sheets({ version: 'v4', auth: client });
    return googleSheets;
}

async function findAll() {
    const googleSheets = await getGoogleSheetsClient();
    const response = await googleSheets.spreadsheets.values.get({
        spreadsheetId,
        range: `${sheetName}`,
    });
    return response.data.values || [];
}

async function findById(id) {
    const data = await findAll();
    return data.find(row => row[0] === id) || null;
}

async function insert(data) {
    const googleSheets = await getGoogleSheetsClient();
    const id = uuidv4();
    const values = [id, ...Object.values(data)];   

    await googleSheets.spreadsheets.values.append({
        spreadsheetId,
        range: `${sheetName}`,
        valueInputOption: 'USER_ENTERED',
        resource: { values: [values] },
    });

    return { id, ...data };
}

async function updateById(id, newData) {
    const googleSheets = await getGoogleSheetsClient();
    const existingData = await findAll();
    const rowNumber = existingData.findIndex(row => row[0] === id);

    if (rowNumber === -1) {
        return null;
    }

    // Create an array that represents the updated row.
    // Ensure the ID is preserved and newData is placed correctly.
    const updatedRow = [id, ...Object.values(newData)];

    const range = `${sheetName}!A${rowNumber + 1}`; // Assuming the ID is in column A
    await googleSheets.spreadsheets.values.update({
        spreadsheetId,
        range,
        valueInputOption: 'USER_ENTERED',
        resource: { values: [updatedRow] },
    });

    return { id, ...newData };
}


async function deleteById(id) {
    const googleSheets = await getGoogleSheetsClient();
    const existingData = await findAll();
    const rowNumber = existingData.findIndex(row => row[0] === id);

    if (rowNumber === -1) {
        return false;
    }

    const range = `${sheetName}!A${rowNumber + 1}:Z${rowNumber + 1}`;
    await googleSheets.spreadsheets.values.clear({
        spreadsheetId,
        range,
    });

    return true;
}

async function createNewSheet(sheetTitle) {
    const googleSheets = await getGoogleSheetsClient();
    
    const request = {
        spreadsheetId,
        resource: {
            requests: [{
                addSheet: {
                    properties: {
                        title: sheetTitle
                    }
                }
            }]
        }
    };

    await googleSheets.spreadsheets.batchUpdate(request);
    return `Sheet ${sheetTitle} created`;
}
async function getSheetNames() {
    const googleSheets = await getGoogleSheetsClient();
    const response = await googleSheets.spreadsheets.get({
        spreadsheetId,
    });

    const sheets = response.data.sheets;
    return sheets.map(sheet => sheet.properties.title);
}
async function deleteSheet(sheetName) {
    const googleSheets = await getGoogleSheetsClient();

    // First, get the ID of the sheet you want to delete
    const spreadsheetData = await googleSheets.spreadsheets.get({
        spreadsheetId,
    });

    const sheet = spreadsheetData.data.sheets.find(s => s.properties.title === sheetName);
    if (!sheet) {
        throw new Error(`Sheet with name "${sheetName}" not found`);
    }

    const sheetId = sheet.properties.sheetId;

    // Now, delete the sheet with the found ID
    await googleSheets.spreadsheets.batchUpdate({
        spreadsheetId,
        resource: {
            requests: [
                {
                    deleteSheet: {
                        sheetId,
                    },
                },
            ],
        },
    });

    return `Sheet "${sheetName}" deleted`;
}



// Export the functions for use in other files
module.exports = { findAll, findById, insert, updateById, deleteById, createNewSheet, getSheetNames, deleteSheet };