From ec6a984b2cd773c5a76a9b00f8b33924ec51818b Mon Sep 17 00:00:00 2001 From: Daniel Wagner-Hall Date: Thu, 16 Oct 2025 15:27:50 +0100 Subject: [PATCH 1/2] Ignore permissions errors getting mentoring sessions --- src/mentoring.rs | 76 ++++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/src/mentoring.rs b/src/mentoring.rs index 0206d44..daa8007 100644 --- a/src/mentoring.rs +++ b/src/mentoring.rs @@ -3,6 +3,7 @@ use std::collections::{btree_map::Entry, BTreeMap}; use anyhow::Context; use chrono::{NaiveDate, Utc}; use serde::Serialize; +use sheets::types::GridData; use tracing::warn; use crate::{ @@ -37,42 +38,13 @@ pub async fn get_mentoring_records( client: SheetsClient, mentoring_records_sheet_id: &str, ) -> Result { - let data = client - .get(mentoring_records_sheet_id, true, &[]) - .await - .map_err(|err| { - err.with_context(|| { - format!( - "Failed to get spreadsheet with ID {}", - mentoring_records_sheet_id - ) - }) - })?; - let expected_sheet_title = "Feedback"; - let sheet = data - .body - .sheets - .into_iter() - .find(|sheet| { - sheet - .properties - .as_ref() - .map(|properties| properties.title.as_str()) - == Some(expected_sheet_title) - }) - .ok_or_else(|| { - Error::Fatal(anyhow::anyhow!( - "Couldn't find sheet '{}' in spreadsheet with ID {}", - expected_sheet_title, - mentoring_records_sheet_id - )) - })?; + let sheet_data = get_mentoring_records_grid_data(client, mentoring_records_sheet_id).await?; let mut mentoring_records = MentoringRecords { records: BTreeMap::new(), }; - for sheet_data in sheet.data { + for sheet_data in sheet_data { if sheet_data.start_column != 0 || sheet_data.start_row != 0 { return Err(Error::Fatal(anyhow::anyhow!( "Start column and row were {} and {}, expected 0 and 0", @@ -124,3 +96,45 @@ pub async fn get_mentoring_records( } Ok(mentoring_records) } + +async fn get_mentoring_records_grid_data( + client: SheetsClient, + mentoring_records_sheet_id: &str, +) -> Result, Error> { + let data_result = client.get(mentoring_records_sheet_id, true, &[]).await; + let data = match data_result { + Ok(data) => data, + Err(Error::PotentiallyIgnorablePermissions(_)) => { + return Ok(Vec::new()); + } + Err(err) => { + let err = err.with_context(|| { + format!( + "Failed to get spreadsheet with ID {}", + mentoring_records_sheet_id + ) + }); + return Err(err); + } + }; + let expected_sheet_title = "Feedback"; + let sheet = data + .body + .sheets + .into_iter() + .find(|sheet| { + sheet + .properties + .as_ref() + .map(|properties| properties.title.as_str()) + == Some(expected_sheet_title) + }) + .ok_or_else(|| { + Error::Fatal(anyhow::anyhow!( + "Couldn't find sheet '{}' in spreadsheet with ID {}", + expected_sheet_title, + mentoring_records_sheet_id + )) + })?; + Ok(sheet.data) +} From decfa9bda08f5ac4818f92eff29f7e9ad42c9741 Mon Sep 17 00:00:00 2001 From: Daniel Wagner-Hall Date: Thu, 16 Oct 2025 15:27:59 +0100 Subject: [PATCH 2/2] Don't log for empty rows This is currently super noisy, because column 5 is a drop-down so is never considered empty. Instead, only log if the first cell of the row is non-empty, and there weren't enough columns for that row. --- src/mentoring.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/mentoring.rs b/src/mentoring.rs index daa8007..b5b4243 100644 --- a/src/mentoring.rs +++ b/src/mentoring.rs @@ -55,7 +55,10 @@ pub async fn get_mentoring_records( for (row_number, row) in sheet_data.row_data.into_iter().enumerate() { let cells = row.values; - if cells.len() < 6 { + if cells.is_empty() { + continue; + } + if cells.len() < 6 && !cell_string(&cells[0]).is_empty() { warn!( "Parsing mentoring data from Google Sheet with ID {}: Not enough columns for row {} - expected at least 6, got {} containing: {}", mentoring_records_sheet_id,