shenghaiwang/googleapiswiftsdk
A modern, Swift-native SDK for the Google API.
Quick Start
1. Authentication Setup
Service Account Authentication (Server-to-Server)
Service account authentication is ideal for server-side applications, automation scripts, and scenarios where you need to access Google Sheets without user interaction.
Setup
- Create a Service Account in the Google Cloud Console
- Download the JSON key file for your service account
- Share your spreadsheet with the service account email address (found in the JSON file)
- Enable the Google Sheets API for your project
Authentication Methods
Method 1: Load from JSON file
import GoogleSheetsSwift
// Load service account from JSON file
let tokenManager = try ServiceAccountTokenManager.loadFromFile("/path/to/service-account.json")
let client = GoogleSheetsClient(tokenManager: tokenManager)
// Now you can perform operations
let values = try await client.readRange("spreadsheet-id", range: "Sheet1!A1:C10")Method 2: Load from environment variable
import GoogleSheetsSwift
// Set environment variable: GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
let tokenManager = try ServiceAccountTokenManager.loadFromEnvironment()
let client = GoogleSheetsClient(tokenManager: tokenManager)Method 3: Initialize directly with ServiceAccountKey
import GoogleSheetsSwift
// Load and parse the service account JSON
let serviceAccountData = try Data(contentsOf: URL(fileURLWithPath: "/path/to/service-account.json"))
let serviceAccountKey = try JSONDecoder().decode(ServiceAccountKey.self, from: serviceAccountData)
// Create token manager
let tokenManager = ServiceAccountTokenManager(serviceAccountKey: serviceAccountKey)
let client = GoogleSheetsClient(tokenManager: tokenManager)2. Basic Operations
Reading Data
// Read values from a range
let values = try await client.readRange(
"your-spreadsheet-id",
range: "Sheet1!A1:C10"
)
// Get string values directly
let stringValues = try await client.readStringValues(
"your-spreadsheet-id",
range: "Sheet1!A1:C10"
)
print("First cell: \(stringValues[0][0] ?? "Empty")")Writing Data
// Write data to a range
let data = [
["Name", "Age", "City"],
["John", "25", "New York"],
["Jane", "30", "San Francisco"]
]
let response = try await client.writeRange(
"your-spreadsheet-id",
range: "Sheet1!A1:C3",
values: data
)
print("Updated \(response.updatedCells ?? 0) cells")Creating Spreadsheets
// Create a new spreadsheet
let spreadsheet = try await client.createSpreadsheet(
title: "My New Spreadsheet",
sheetTitles: ["Data", "Analysis"]
)
print("Created spreadsheet: \(spreadsheet.spreadsheetId ?? "unknown")")Advanced Usage
Batch Operations
// Batch read multiple ranges
let operations = [
BatchReadOperation(range: "Sheet1!A1:C10"),
BatchReadOperation(range: "Sheet2!A1:D5")
]
let results = try await client.batchRead(
"your-spreadsheet-id",
operations: operations
)
// Batch write to multiple ranges
let writeOperations = [
BatchWriteOperation(range: "Sheet1!A1:B2", values: [["A1", "B1"], ["A2", "B2"]]),
BatchWriteOperation(range: "Sheet1!D1:E2", values: [["D1", "E1"], ["D2", "E2"]])
]
let writeResponse = try await client.batchWrite(
"your-spreadsheet-id",
operations: writeOperations
)Custom Configuration
// Create client with custom configuration
let logger = ConsoleGoogleSheetsLogger(minimumLevel: .debug)
let cache = InMemoryResponseCache()
let cacheConfig = CacheConfiguration(ttl: 300, maxSize: 100)
let client = GoogleSheetsClient(
tokenManager: tokenManager,
logger: logger,
cache: cache,
cacheConfiguration: cacheConfig
)
// Enable debug mode
client.setDebugMode(true)Error Handling
do {
let values = try await client.readRange("spreadsheet-id", range: "A1:B2")
// Process values
} catch GoogleSheetsError.authenticationFailed(let message) {
print("Authentication failed: \(message)")
} catch GoogleSheetsError.rateLimitExceeded(let retryAfter) {
print("Rate limited. Retry after: \(retryAfter ?? 0) seconds")
} catch GoogleSheetsError.invalidSpreadsheetId(let id) {
print("Invalid spreadsheet ID: \(id)")
} catch {
print("Unexpected error: \(error)")
}A1 Notation Utilities
// Validate A1 notation
let isValid = GoogleSheetsClient.isValidA1Range("Sheet1!A1:B10")
// Convert column numbers to letters
let columnLetter = GoogleSheetsClient.columnNumberToLetters(27) // "AA"
// Convert column letters to numbers
let columnNumber = try GoogleSheetsClient.columnLettersToNumber("AA") // 27
// Build A1 ranges programmatically
let range = GoogleSheetsClient.buildA1Range(
sheetName: "Data",
startColumn: 1, startRow: 1,
endColumn: 5, endRow: 100
) // "Data!A1:E100"Package Metadata
Repository: shenghaiwang/googleapiswiftsdk
Default branch: master
README: README.md