forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								import { google } from "googleapis";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import { set_fs, readFile, utils } from 'xlsx';
							 | 
						||
| 
								 | 
							
								import * as fs from 'fs';
							 | 
						||
| 
								 | 
							
								set_fs(fs);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Change this import statement to point to the credentials JSON file */
							 | 
						||
| 
								 | 
							
								import creds from './sheetjs-test-726272627262.json' assert { type: "json" };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Change this to the spreadsheet ID */
							 | 
						||
| 
								 | 
							
								const id = "SOME-SPREADSHEETJS-ID";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* connect to google services */
							 | 
						||
| 
								 | 
							
								const jwt = new google.auth.JWT({
							 | 
						||
| 
								 | 
							
								  email: creds.client_email,
							 | 
						||
| 
								 | 
							
								  key: creds.private_key,
							 | 
						||
| 
								 | 
							
								  scopes: [
							 | 
						||
| 
								 | 
							
								    'https://www.googleapis.com/auth/spreadsheets',
							 | 
						||
| 
								 | 
							
								    'https://www.googleapis.com/auth/drive.file',
							 | 
						||
| 
								 | 
							
								  ]
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const sheets = google.sheets({ version: "v4", auth: jwt });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* get existing sheets */
							 | 
						||
| 
								 | 
							
								const wsheet = await sheets.spreadsheets.get({spreadsheetId: id});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* remove all sheets after the first */
							 | 
						||
| 
								 | 
							
								if(wsheet.data.sheets.length > 1) await sheets.spreadsheets.batchUpdate({
							 | 
						||
| 
								 | 
							
								  spreadsheetId: id,
							 | 
						||
| 
								 | 
							
								  requestBody: { requests:
							 | 
						||
| 
								 | 
							
								    wsheet.data.sheets.slice(1).map(s => ({
							 | 
						||
| 
								 | 
							
								      deleteSheet: {
							 | 
						||
| 
								 | 
							
								        sheetId: s.properties.sheetId
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }))
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* read file */
							 | 
						||
| 
								 | 
							
								const wb = readFile("pres.numbers");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* rename first worksheet to avoid collisions */
							 | 
						||
| 
								 | 
							
								const props0 = wsheet.data.sheets[0].properties;
							 | 
						||
| 
								 | 
							
								if(wb.SheetNames.map(n => n.toLowerCase()).includes(props0.title.toLowerCase())) {
							 | 
						||
| 
								 | 
							
								  await sheets.spreadsheets.batchUpdate({
							 | 
						||
| 
								 | 
							
								    spreadsheetId: id,
							 | 
						||
| 
								 | 
							
								    requestBody: { requests: [{
							 | 
						||
| 
								 | 
							
								      updateSheetProperties: {
							 | 
						||
| 
								 | 
							
								        fields: "title",
							 | 
						||
| 
								 | 
							
								        properties: {
							 | 
						||
| 
								 | 
							
								          sheetId: props0.sheetId,
							 | 
						||
| 
								 | 
							
								          title: "thistitleisatleast33characterslong"
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }]}
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  console.log(`renamed "${props0.title}" to "thistitleisatleast33characterslong"`);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* add sheets from file */
							 | 
						||
| 
								 | 
							
								for(let name of wb.SheetNames) {
							 | 
						||
| 
								 | 
							
								  const aoa = utils.sheet_to_json(wb.Sheets[name], {header:1});
							 | 
						||
| 
								 | 
							
								  await sheets.spreadsheets.batchUpdate({
							 | 
						||
| 
								 | 
							
								    spreadsheetId: id,
							 | 
						||
| 
								 | 
							
								    requestBody: { requests: [
							 | 
						||
| 
								 | 
							
								      /* add new sheet */
							 | 
						||
| 
								 | 
							
								      { addSheet: { properties: { title: name } } },
							 | 
						||
| 
								 | 
							
								    ] }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  await sheets.spreadsheets.values.update({
							 | 
						||
| 
								 | 
							
								    spreadsheetId: id,
							 | 
						||
| 
								 | 
							
								    range: `'${name}'!A1`,
							 | 
						||
| 
								 | 
							
								    valueInputOption: "USER_ENTERED",
							 | 
						||
| 
								 | 
							
								    resource: { values: aoa }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  console.log(`Created Google Worksheet "${name}"`);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* remove first sheet */
							 | 
						||
| 
								 | 
							
								const res = await sheets.spreadsheets.batchUpdate({
							 | 
						||
| 
								 | 
							
								  spreadsheetId: id,
							 | 
						||
| 
								 | 
							
								  requestBody: { requests: [
							 | 
						||
| 
								 | 
							
								    /* remove old first sheet */
							 | 
						||
| 
								 | 
							
								    { deleteSheet: { sheetId: wsheet.data.sheets[0].properties.sheetId } }
							 | 
						||
| 
								 | 
							
								  ] }
							 | 
						||
| 
								 | 
							
								});
							 |