Friday, 19 November 2021

How to Get the Permanent URL of an Email Message in Gmail with Apps Script

All email messages in your Gmail inbox have a permanent web address and you can add this URL to your bookmarks to quickly access that message in the future. You can save these message links in your task list or your meeting notes as they provide important context to the conversation.

Gmail Email Link Bookmarks

The URL of any email message is Gmail follows a standard format:

https://mail.google.com/mail/u/<<UserId>>/#label/<<Label>>/<<UniqueId>>

The UserId is the sequential ID of the currently-logged Gmail account (default is 0). The Label is the name of the Gmail label that the message is in (or use all). The UniqueId is a unique ID that Gmail assigns to each message.

The key here is the UniqueId that is internally assigned by Gmail.

When you send an email with Google Apps Script, the Gmail API returns a unique ID that you can use to determine the URL of the email message in your sent items.

Here’s a simple procedure to send an email that is base64 encoded.

const sendGmailMessage = (mimeText) => {
  const GMAIL_API =
    "https://gmail.googleapis.com/upload/gmail/v1/users/me/messages/send";
  const params = {
    method: "POST",
    contentType: "message/rfc822",
    headers: {
      Authorization: `Bearer ${ScriptApp.getOAuthToken()}`,
    },
    payload: mimeText,
  };
  const response = UrlFetchApp.fetch(GMAIL_API, params);
  const { id: messageId } = JSON.parse(response.getContentText());
  return messageId;
};

Now that you have the messageId of the outgoing email message, there are at least three ways to get the URL (permalink) of the email message:

Option 1: Use the standard URL format

const getEmailMessageUrl = (messageId) => {
  return `https://mail.google.com/mail/u/0/#all/${messageId}`;
};

Option 2: Use Apps Script to get the email thread URL

In this approach, we get the associated thread of the email message and then get the URL of the first message in the thread.

const getThreadUrl = (messageId) => {
  const message = GmailApp.getMessageById(messageId);
  return message.getThread().getPermalink();
};

Option 3: Use the Message-Id in Email Header

This is my favorite approach because it is the most reliable. When you send an email message, a unique message ID is assigned to the email message by the sending service. This message ID is stored in the Message-Id header of the email message and is used by your email client to group messages in the same conversation.

Gmail provides a special rfc822msgid search operator to search emails by message ID and we can use this search operator to get the URL of the email message.

const getMessageUrl = (messageId) => {
  const message = GmailApp.getMessageById(messageId);
  const rfc822Id = message.getHeader("Message-Id");
  const searchQuery = `rfc822msgid:<${rfc822Id}>`;
  return `https://mail.google.com/mail/u/0/#search/${searchQuery}`;
};

Related: Get a second email address with your @gmail address



from Digital Inspiration https://ift.tt/3Cs2EF2

Thursday, 18 November 2021

How to Import Lodash in your JavaScript Projects for Lowest Bundle Size

Lodash is an extremely popular JavaScript library that provides a lot of useful functions for working with strings, arrays and objects in your web projects.

Some of the Lodash functions are now supported natively in modern JavaScript, but the library still adds value and saves you time.

For instance, if you want to generate a random number between 1 and 10, the _.random(1, 10) function is a great way to do it, similar to the RANDBETWEEN function of Google Sheets. The _.shuffle() function can help you quickly shuffle an array of values.

The Correct Way to Include Lodash

If your JavaScript project requires Lodash, you can include the library in your code in 4 different ways.

1. Import the entire lodash library

import _ from "lodash";

const capitalizeFirstName = (name) => {
  const result = _.capitalize(name);
  console.log(response);
};

2. Import using named aliases

import { capitalize } from "lodash";

const capitalizeFirstName = (name) => {
  const result = capitalize(name);
  console.log(response);
};

3. Import specific methods by path

import capitalize from "lodash/capitalize";

const capitalizeFirstName = (name) => {
  const result = capitalize(name);
  console.log(response);
};

4. Use per-method lodash packages

import capitalize from "lodash.capitalize";

const capitalizeFirstName = (name) => {
  const result = capitalize(name);
  console.log(response);
};

Which importing method would result in the lowest bundle size?

The option #1 will include the entire lodash library in your output bundle and is not recommended. The second option will also import the full library and should be avoided.

The #4 method of importing per-method lodash packages will result in the lowest bundle size, but it is not recommended since this approach will be deprecated in the future versions of lodash.

The approach #3 is recommended since it will only import the specific Lodash methods you need and also reduce the bundle size.

Bonus Tip: Memoization with Lodash

The Lodash library includes a memoization method called _.memoize() which is useful for caching expensive functions.

import memoize from "lodoash/memoize";

const expensiveFunction = (input) => {
  return input * input;
};

const memoizedFunction = memoize(expensiveFunction);

console.log(memoizedFunction(5)); // Calculates the square of 5
console.log(memoizedFunction(5)); // Returns the cached value

There’s however a big limitation of memoization with Lodash - it will only use the first parameter of the function as the cache key and ignore the rest. Let me explain.

const add = (a, b) => {
  return a + b;
};

const memoizedAdd = _.memoize(add);
console.log(memoizedAdd(1, 2)); // Calculates the sum of 1 and 2 and caches the result
console.log(memoizedAdd(1, 3)); // Returns the cached value which is 3 (incorrect)

As you may have noticed, the second parameter of the function is ignored and thus the result is incorrect since it returned the cached value based on the first parameter itself.

Memoization with Multiple Parameters

To fix this problem, you can use an alternative memoization library like fast-memoize or you can add a resolver function to the memoization method as shown below.

const multiply = (a, b) => {
  return a * b;
};

const resolver = (...args) => {
  return JSON.stringify(args);
};

const memoizedMultiply = _.memoize(multiply, resolver);

console.log(memoizedMultiply(1, 2)); // Calculates the product of 1 and 2 and caches the result
console.log(memoizedMultiply(1, 3)); // Calculates the product of 1 and 3 and caches the result
console.log(memoizedMultiply(1, 2)); // Returns the cached value


from Digital Inspiration https://ift.tt/3wYGx7T