sheets_client.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from typing import List
  2. from google.auth import default
  3. from googleapiclient.discovery import build
  4. from googleapiclient.errors import HttpError
  5. from openhands.core.logger import openhands_logger as logger
  6. class GoogleSheetsClient:
  7. def __init__(self):
  8. """Initialize Google Sheets client using workload identity.
  9. Uses application default credentials which supports workload identity when running in GCP.
  10. """
  11. logger.info('Initializing Google Sheets client with workload identity')
  12. try:
  13. credentials, project = default(
  14. scopes=['https://www.googleapis.com/auth/spreadsheets.readonly']
  15. )
  16. logger.info(f'Successfully obtained credentials for project: {project}')
  17. self.service = build('sheets', 'v4', credentials=credentials)
  18. logger.info('Successfully initialized Google Sheets API service')
  19. except Exception as e:
  20. logger.error(f'Failed to initialize Google Sheets client: {str(e)}')
  21. self.service = None
  22. def get_usernames(self, spreadsheet_id: str, range_name: str = 'A:A') -> List[str]:
  23. """Get list of usernames from specified Google Sheet.
  24. Args:
  25. spreadsheet_id: The ID of the Google Sheet
  26. range_name: The A1 notation of the range to fetch
  27. Returns:
  28. List of usernames from the sheet
  29. """
  30. if not self.service:
  31. logger.error('Google Sheets service not initialized')
  32. return []
  33. try:
  34. logger.info(
  35. f'Fetching usernames from sheet {spreadsheet_id}, range {range_name}'
  36. )
  37. result = (
  38. self.service.spreadsheets()
  39. .values()
  40. .get(spreadsheetId=spreadsheet_id, range=range_name)
  41. .execute()
  42. )
  43. values = result.get('values', [])
  44. usernames = [
  45. str(cell[0]).strip() for cell in values if cell and cell[0].strip()
  46. ]
  47. logger.info(
  48. f'Successfully fetched {len(usernames)} usernames from Google Sheet'
  49. )
  50. return usernames
  51. except HttpError as err:
  52. logger.error(f'Error accessing Google Sheet {spreadsheet_id}: {err}')
  53. return []
  54. except Exception as e:
  55. logger.error(
  56. f'Unexpected error accessing Google Sheet {spreadsheet_id}: {str(e)}'
  57. )
  58. return []