mirror of
https://github.com/bellingcat/auto-archiver.git
synced 2026-06-12 21:28:29 +03:00
extracted worksheet operations
This commit is contained in:
97
gworksheet.py
Normal file
97
gworksheet.py
Normal file
@@ -0,0 +1,97 @@
|
||||
from gspread import utils
|
||||
|
||||
|
||||
class GWorksheet:
|
||||
COLUMN_NAMES = {
|
||||
'url': 'media url',
|
||||
'archive': 'archive location',
|
||||
'date': 'archive date',
|
||||
'status': 'archive status',
|
||||
'thumbnail': 'thumbnail',
|
||||
'thumbnail_index': 'thumbnail index',
|
||||
'timestamp': 'upload timestamp',
|
||||
'title': 'upload title',
|
||||
'duration': 'duration'
|
||||
}
|
||||
|
||||
def __init__(self, worksheet, columns=COLUMN_NAMES):
|
||||
self.wks = worksheet
|
||||
self.headers = [v.lower() for v in self.wks.row_values(1)]
|
||||
self.columns = columns
|
||||
|
||||
def worksheet(self): return self.wks
|
||||
|
||||
def _check_col_exists(self, col: str):
|
||||
if col not in self.columns:
|
||||
raise Exception(f'Column {col} is not in the configured column names: {self.columns.keys()}')
|
||||
|
||||
def col_exists(self, col: str):
|
||||
self._check_col_exists(col)
|
||||
return self.columns[col] in self.headers
|
||||
|
||||
def col_index(self, col: str):
|
||||
self._check_col_exists(col)
|
||||
return self.headers.index(self.columns[col])
|
||||
|
||||
def count_rows(self):
|
||||
return len(self.wks.get_values())
|
||||
|
||||
def get_row(self, row: int):
|
||||
# row is 1-based
|
||||
return self.wks.row_values(row)
|
||||
|
||||
def cell(self, row, col: str):
|
||||
# row can be index (1-based) or list of values
|
||||
if type(row) == int:
|
||||
row = self.get_row(row)
|
||||
|
||||
col_index = self.col_index(col)
|
||||
if col_index >= len(row):
|
||||
return ''
|
||||
return row[col_index]
|
||||
|
||||
def update(self, row: int, col: str, val):
|
||||
# row is 1-based
|
||||
col_index = self.col_index(col) + 1
|
||||
self.wks.update_cell(row, col_index, val)
|
||||
|
||||
def update_batch(self, updates):
|
||||
updates = [
|
||||
{
|
||||
'range': self.to_a1(row, self.col_index(col) + 1),
|
||||
'values': [[val]]
|
||||
}
|
||||
for row, col, val in updates
|
||||
]
|
||||
self.wks.batch_update(updates, value_input_option='USER_ENTERED')
|
||||
|
||||
def to_a1(self, row: int, col: int):
|
||||
# row, col are 1-based
|
||||
return utils.rowcol_to_a1(row, col)
|
||||
|
||||
# def index_to_col(self, index):
|
||||
# alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
|
||||
# if index > 25:
|
||||
# t = index
|
||||
# dig = 0
|
||||
# while t > 25:
|
||||
# t = math.floor(t / 26)
|
||||
# dig += 1
|
||||
# return alphabet[t - 1] + self.index_to_col(index - t * int(math.pow(26, dig)))
|
||||
# else:
|
||||
# return alphabet[index]
|
||||
|
||||
# def col_to_index(self, col):
|
||||
# col = list(col)
|
||||
# ndigits = len(col)
|
||||
# alphabet = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
# v = 0
|
||||
# i = ndigits - 1
|
||||
|
||||
# for digit in col:
|
||||
# index = alphabet.find(digit)
|
||||
# v += (26 ** i) * index
|
||||
# i -= 1
|
||||
|
||||
# return v - 1
|
||||
Reference in New Issue
Block a user