Harness - Utilize secretive environment variables in Typescript to enhance Google Apps Script development

Are there any solutions available to avoid embedding secrets directly into a Google Apps Script project?

I am utilizing clasp and coding in Typescript following the instructions outlined in this guide.

At the moment, my script (Main.ts) contains hardcoded secrets that I prefer not to store in version control. It would be ideal if these secrets could be dynamically replaced based on environment variables.

Answer №1

Securing sensitive information in Google Apps Script can be achieved by utilizing the PropertiesService:

To safeguard the secret(s), employ a function similar to this:

function protectSecrets() {
    PropertiesService.getScriptProperties().setProperties({
        'secret1': 'myHighlyConfidentialPasscode',
        'secret2': 'mySecureToken',
        // and so on...
    })
}

This function must be executed once using clasp push in the editor (or clasp run protectSecrets), after which you should remove it, all while avoiding any commits to version control.

Following this process, access the stored secrets in your code with something like:

let token = PropertiesService.getScriptProperties().getProperty('secret2')

Keep in mind that individuals with editing privileges to your project can still access these secrets; however, this method effectively prevents them from being exposed through version control.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Discover the process of dynamically importing JavaScript libraries, modules, and non-component elements within a Next.js

Lately, I have been utilizing Next.js and mastering its dynamic import feature for importing components with named exports. However, I recently encountered a particular npm package that functions only on the client-side (requires window) and has a substant ...

Filter an object in Typescript and retrieve a single key

Managing a set of checkboxes is essential in assigning roles to new users. While it's possible to filter and retrieve only the checked checkboxes, extracting just the "name" key poses a challenge. The current method involves filtering with a for loop ...

What is the best way to determine in component.html whether the column type is equal to 1 to show the label text "Active,"

Having trouble checking the value of an object named ReportControl. If the column type is 1, display the label "active"; otherwise, display the label "not active" on reportcomponent.html. The data for the ReportControl object is as follows: {"reportId": ...

What does 'this' refer to in a JavaScript function that is inside an object?

I'm currently working with a JavaScript code snippet that looks like the example below. On this particular line, this.orgBusinessKey = this.user.noaOrganisationList[0].businessKey; I'm wondering if the this scope will contain the user instance ...

How can I create an interceptor in Angular2 to detect 500 and 404 errors in my app.ts file?

Creating an Angular2 Interceptor for Handling 500 and 404 Errors in app.ts In my app.ts file, I am looking to implement an interceptor that can detect a 500 or 404 error so that I can appropriately redirect to my HTML 404 or HTML 500 pages. Is this funct ...

What is the best way to set up a reactive form in Angular using the ngOnInit lifecycle

I have been facing an issue while trying to set up my reactive form with an observable that I subscribed to. Within the form class template, I used the ngOnInit lifecycle hook to fetch the desired object, which is the product. The first code snippet repre ...

Tips for avoiding swiper from interacting with the content upon reaching the final swiper slide button

Can anyone help me with a problem I'm experiencing? When navigating using the next or previous buttons, I always come across one button that is grayed out, indicating that I cannot move forward (for the next button) or backward (for the prev button) a ...

Angular 2 Error: Trying to access 'annotations' property of undefined variable causing TypeError

Where could I be making a mistake? app.component.ts import {Component} from 'angular2/core'; @Component({ selector: 'my-app', template: `{{title}}` }) export class App { title = "Angular 2 beta"; constructor() { console.clea ...

Tips for conducting tests on ngrx/effects using Jasmine and Karma with Angular 5 and ngrx 5

Here is the file that I need to test. My current focus is on some effects service while working with Angular5 (^5.2.0) and ngrx5 (^5.2.0). I have been struggling to properly implement the code below for testing purposes. Any tips or suggestions would be ...

After upgrading from Angular 13 to 14, the <app-root> component is failing to load. Despite no noticeable changes, the issue persists

Having upgraded my Angular 13 app to version 14, I encountered an issue where the page no longer loads properly. Despite checking the configuration and stripping down the index.html file to its basics, the issue persists - nothing seems to be working. Upo ...

Received Angular Error: Attempting to differentiate '[object Object]'. Permissible are only arrays and iterables

I've encountered an error while working on my front-end in Angular with Node.js as the backend. I'm struggling to identify the cause of this issue. Here is a snippet of my code. country.ts export class Country { id?: string; name?: string; ...

What kind of parameter can be specified for a generic method that will not actually be called?

Currently, I am attempting to create a method that includes a parameter with a generic type. In this case, I have used 'unknown' as the generic type since it is not needed: function f(op: Operation<unknown>): void {...}. However, this appro ...

Cracked Code at Position 880 (LeetCode)

Given an encoded string S, the decoded string is determined by reading each character and following the steps below: If the character is a letter, it is written directly onto the tape. If the character is a digit (denoted as d), the current tape i ...

Retrieve the complete list of exported elements within the document

My collection of minor components is extensive: export const A = () => {...} export const B = () => {...} ... export default [A, B, ...]; Each time I add a new component to the file, there's a chance I might overlook adding it to the expor ...

Troubleshooting Typescript compilation issues following an upgrade to a React Native project

I am facing a challenge while updating a react native project from version 0.63.3 to 0.67.0. When attempting to run npm run tsc, I encounter numerous errors indicating that the typescript packages are not compatible with their original packages. Here is a ...

An error has occurred in Typescript stating that there is no overload that matches the call for AnyStyledComponent since the update to nextjs

Upgraded to the latest version of nextjs, 13.3.1, and encountered an error in the IDE related to a styled component: Received error TS2769 after the upgrade: No overload matches this call. Overload 1 of 2, '(component: AnyStyledComponent): ThemedSty ...

unable to expand GraphQL types within subgraph

Currently, I am leveraging Apollo Federation alongside TypeScript to develop subgraphs and a GraphQL federated server. In one subgraph, I've defined a type and now I aim to extend it by adding a new field in another subgraph. To achieve this, I implem ...

Utilize Ngrx to keep an eye on specific items within the store

If we consider an interface called INotification: export interface INotification { id: number; DateReceived: number; Title: string; Message: string; Tipology: string; isRead: number; } and a reducer system. In the component, it&ap ...

UglifyJs encountered an unexpected character '@'

Upon trying to build my Angular 6 App using ng build ---prod, I encountered the following error: ERROR in scripts.28e0dfadf7f39e74e940.js from UglifyJs Unexpected character '@' [scripts.28e0dfadf7f39e74e940.js:13,0] What might be causing this ...

How can I display an agm-polyline within a map in Angular 7?

I need assistance with adjusting the polylines on my map and dynamically setting the zoom level based on their size and position. Here is the code I am currently using: <agm-map style="height: 500px" [latitude]='selectedLatitude' [longitude ...