synct
(derived from synchronize tables) is a Python script that retrieves data from a source and converts it to either a Google or Excel spreadsheet as defined in the configuration file.
The script can be installed on Fedora systems using dnf
with the package stored in this project:
sudo dnf install synct-1.8.1-1.fc40.noarch.rpm
Alternatively, you can install the script from Fedora COPR using these commands:
sudo dnf copr enable aries/synct
sudo dnf install synct
The following packages are required:
python3-bugzilla
python3-google-api-client
python3-google-auth-oauthlib
python3-jira
python3-openpyxl
python3-pandas
python3-pyperclip
python3-pyyaml
The script can be installed on Linux or MacOS systems using pip
:
python -m pip install synct-1.8.1.tar.gz
The following dependencies will be installed from PyPI by the above command:
google-api-python-client
google-auth-oauthlib
jira
openpyxl
pandas
pyperclip
pyyaml
python-bugzilla
synct [-h] [--version] \
[-c CONFIG] [-s SHEET [SHEET ...]] \
[-a] [-r] [-n] \
[-f FILE] [-t TABLE] [-o OFFSET] \
[-v] [-q]
The script updates data rows in the target Google or Excel spreadsheet based on key values. If a key value is missing or placed inappropriately, it should be manually corrected. The script can then update the related data. Missing key values are stored in the clipboard, separated by new lines, which allows for easy copying into the spreadsheet.
-
-h
,--help
- Show help message with a list of options and their descriptions, and exit without any action.
-
--version
- Display the script name and version, then exit without any action.
-
-c CONFIG
,--config CONFIG
- Specify the name of the YAML configuration file containing the input identification with access attributes, a reference to the target spreadsheet with sheet names and related queries, column names with their related items, and additional parameters defining the content of the spreadsheet. If this option is not specified, the script uses the
synct.yaml
file in the working directory.
- Specify the name of the YAML configuration file containing the input identification with access attributes, a reference to the target spreadsheet with sheet names and related queries, column names with their related items, and additional parameters defining the content of the spreadsheet. If this option is not specified, the script uses the
-
-s SHEET [SHEET ...]
,--sheet SHEET [SHEET ...]
- Specify which sheets to processed. The selected sheets can be any sheets defined in the configuration YAML file. If this option is not specified, all sheets listed in the configuration file will be processed.
-
-a
,--add
- Enable the addition of missing rows to the spreadsheet. The added rows are placed at the end of the specific sheet.
-
-n
,--noupdate
- Disable updating the target spreadsheet.
-
-r
,--remove
- Enable the removal of rows in the spreadsheet. This option is relevant for rows whose values are not retrieved from the source. For example, if the script is configured to collect and update open bugs from Bugzilla, the
-r
parameter allows the deletion of rows containing bugs that aro no longer retrieved, such as those that have been closed. Without this option, such rows are not updated, and a warning is reported by the script.
- Enable the removal of rows in the spreadsheet. This option is relevant for rows whose values are not retrieved from the source. For example, if the script is configured to collect and update open bugs from Bugzilla, the
-
-f FILE
,--file FILE
- Specify the source file name, which can be an Excel or OpenDocument spreadsheet or a CSV file. If this parameter is used, the source file defined in the configuration file is ignored.
-
-t TABLE
,--table TABLE
- Specify the table/sheet in the source file to be used. If this parameter is used, the table name defined in the configuration file is ignored.
-
-o OFFSET
,--offset OFFSET
- Define the header offset in the source file. If this parameter is used, the offset defined in the configuration file is ignored. The default value is 0.
-
-v
,--verbose
- By default, the script reports warnings and errors. The
-v
parameter increases the logging level to include the informational messages. Repeating the option (-vv
) increases verbosity further to include the debug messages.
- By default, the script reports warnings and errors. The
-
-q
,--quiet
- Reduce logging to errors only.
The configuration file contains reserved words written in capital letters, as well as additional data that defines the transition of input data to the target spreadsheet.
Bugzilla REST API documentation: https://wiki.mozilla.org/Bugzilla:REST_API
GitHub REST API documentation: https://docs.github.com/en/rest
GitLab REST API documentation: https://docs.gitlab.com/ee/api/rest/
Jira REST API documentation: https://developer.atlassian.com/server/jira/platform/rest-apis/
Jira structured data, including custom field IDs and names, can be found in XML data exported from Jira.
Reserved word | Description |
---|---|
API_KEY |
File name containing API key to access Bugzilla. |
BUGZILLA |
Specifies that the script retrieves data from Bugzilla. It should contain API_KEY , DOMAIN , and URL . |
CONDITION |
Used with the FROM and GET reserved words to define a condition that must be met to obtain the required data from the input. |
DEFAULT_COLUMNS |
Enables the use of default column names. This means they can be omitted in the configuration file, and source data items and target spreadsheet columns with matching names are paired automatically. The reserved word value can be either 'True' or 'False' and can be defined either globally or specifically for each sheet. This option is globally set to 'False' by default. |
DELIMITER |
The delimiter separates items in one cell. The default value is a space. The delimiter can be defined globally or individually for sheets and columns. If DELIMITER is defined together with the GET reserved word, it defines a separator between items obtained from the GET list. |
DOMAIN |
Bugzilla domain. |
FILE |
Specifies that the script retrieves data from a local file in spreadsheet format (.ods, .xls, .xlsx, .csv). It should contain TYPE , optionally FILE_NAME , OFFSET and/or TABLE . |
FILE_NAME |
Name of the input file (optional). It is ignored if a file name is defined on the command line. |
FROM |
Used with the GET (and optionally with the CONDITION ) reserved word to address the higher level of structured identifiers. |
GET |
Used with the FROM (and optionally with the CONDITION ) reserved word to address the list of lower-level structured identifiers with explicit values, which can be regular expressions. |
GITHUB |
Specifies that the script retrieves data from GitHub. It should contain SEARCH_API and TOKEN . |
GITLAB |
Specifies that the script retrieves data from GitLab. It should contain SEARCH_API and TOKEN . |
HEADER_OFFSET |
The first row of the target spreadsheet is expected to be the header. In this case, HEADER_OFFSET is 0, which is the default value. If the header spans multiple rows, HEADER_OFFSET defines the value. It can be defined either globally or specifically for each sheet. |
INHERIT_FORMULAS |
Enables formula inheritance in added rows from the last original row in the columns that are not included in the source data. The reserved word value can be either 'True' or 'False' and can be defined either globally or specifically for each sheet or column. This option is globally set to 'False' by default. |
JIRA |
Specifies that the script retrieves data from Jira. It should contain SERVER and TOKEN , optionally MAX_RESULTS . |
KEY |
The column containing keys is identified by the KEY reserved word with a value of True . It can be defined either globally or specifically for each sheet. |
LINK |
Used in columns, it contains a URL that is used as a prefix for values. If the column is a key column, link format is used. |
MAX_RESULTS |
Defines the maximum number of items obtained from Jira for each query (pagination is supported). The default value is 100. It can only be part of the JIRA section. |
NAME |
Defines the name of each sheet. |
OFFSET |
Header offset in the spreadsheet input file (optional). It is ignored if an offset is defined on the command line. |
OPTIONAL |
When the key with this specific column value is missing, it is not reported as a warning. The value can be a regular expression. |
QUERY |
Query definition for each sheet. It is specific to the input: Bugzilla queries are in YAML format, GitHub queries follow the GitHub Search API rules, and GitLab queries follow GitLab Search API rules. Jira queries are written JIRA Query Language (JQL), and queries for spreadsheets are in Pandas query format. |
SEARCH_API |
URL of the GitHub or GitLab search API. It can only be a part of the GITHUB or GITLAB section. |
SERVER |
URL of the Jira server. It can only be a part of the JIRA section. |
SHEET_COLUMNS |
Reserved word defining of column names and their relation to data identifiers obtained from the input. It can be defined either globally or specifically for each sheet. |
SHEETS |
List of sheets in the target spreadsheet. |
SOURCE |
Reserved word defining the column name's relation to the data identifier obtained from the input. It is used when multiple reserved words belong to a specific column, such as CONDITION , FROM , GET , KEY , LINK , or OPTIONAL . |
SPREADSHEET |
Name of the target Excel spreadsheet. |
SPREADSHEET_ID |
ID of the target Google spreadsheet. |
TABLE |
Table/sheet name of the spreadsheet source (optional). Only one table is allowed. It is ignored if a table name is defined on the command line. |
TOKEN |
The file name containing the token to access GitHub, GitLab or Jira. |
TYPE |
Type of the local input file. It must contain the value SPREADSHEET . |
URL |
Bugzilla URL. |
Configuration file examples for different data source types can be found in the examples directory.
Bugzilla access is handled using an API key, as described at https://bugzilla.readthedocs.io/en/latest/api/core/v1/general.html#authentication. An API key can be generated in the Preferences of the personal Bugzilla profile and stored in a file referred to in the YAML configuration file of the script.
The script uses the REST API, which can use an API token generated according to the guidance here: https://docs.github.com/en/rest/overview/authenticating-to-the-rest-api. The stored token file must be referred to in the YAML configuration file of the script.
The script uses the REST API, which uses an API token generated according to the guidance here: https://docs.gitlab.com/ee/api/rest/#authentication. The stored token file must be referred to in the YAML configuration file of the script.
The script uses the REST API, which requires an API token. The token can be generated from your Jira account according to the guidance here: https://confluence.atlassian.com/enterprise/using-personal-access-tokens-1026032365.html. The stored token file must be referred to in the YAML configuration file of the script.
To use the Google Sheets API to read and write data, the script requires authorized access using OAuth 2.0 credentials in the form of a service account JSON key file. Follow these steps to set up the necessary credentials:
-
Create Service Account Credentials
- Go to the Google Cloud Console.
- Select your project or create a new one.
- Navigate to APIs & Services > Credentials.
- Click on Create credentials and select Service account.
- Follow the prompts to set up a service account. You may choose a descriptive name, role, and other settings.
-
Download the JSON Key File
- Once the service account is created, go to the Keys section.
- Click Add Key > Create new key.
- Choose JSON and download the key file. Save it in a secure location, for example in
.google/google_credentials.json
file in you home directory.
-
Enable Required APIs
- Navigate to APIs & Services > Library.
- Enable the following APIs for your project:
- Google Sheets API
- Google Drive API
-
Set Up Environment Variable for Credentials
- Set the
GOOGLE_APPLICATION_CREDENTIALS
environment variable to the path of your downloaded JSON key file. This variable allows your script to authenticate using the service account credentials.
- Set the
-
Configure OAuth Consent Screen
- Navigate to APIs & Services > OAuth consent screen.
- Choose Internal or External based on your usage.
- Complete the required fields. If you use sensitive or restricted scopes, you'll need to go through the verification process.
-
Set OAuth Scopes Make sure that your OAuth consent screen allows access to the necessary Google Sheets API scopes:
API Scope User-facing description Google Sheets API https://www.googleapis.com/auth/spreadsheets
See, edit, create, and delete all your Google Sheets spreadsheets
Bugs can be reported or new feature requests can be raised in the Issues section.