{"id":261,"date":"2024-06-16T06:42:53","date_gmt":"2024-06-16T06:42:53","guid":{"rendered":"https:\/\/www.rajeshkumar.xyz\/blog\/?p=261"},"modified":"2024-06-16T06:46:00","modified_gmt":"2024-06-16T06:46:00","slug":"to-extract-all-email-addresses-from-your-entire-gmail-account","status":"publish","type":"post","link":"https:\/\/www.rajeshkumar.xyz\/blog\/to-extract-all-email-addresses-from-your-entire-gmail-account\/","title":{"rendered":"To extract all email addresses from your entire Gmail account"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"908\" height=\"336\" src=\"https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2024\/06\/image.png\" alt=\"\" class=\"wp-image-262\" srcset=\"https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2024\/06\/image.png 908w, https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2024\/06\/image-300x111.png 300w, https:\/\/www.rajeshkumar.xyz\/blog\/wp-content\/uploads\/2024\/06\/image-768x284.png 768w\" sizes=\"auto, (max-width: 908px) 100vw, 908px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Method 1: Using Google Apps Script<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Open Google Sheets<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Create a new Google Sheet.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Open Script Editor<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Go to <code>Extensions<\/code> &gt; <code>Apps Script<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Copy and Paste the Script<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Copy the following script and paste it into the script editor. This script will iterate through all threads in your Gmail account and extract email addresses from the sender and recipients.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Run the Script<\/strong>:<\/li>\n\n\n\n<li>Save the script and click the play button (Run) to execute the function <code>getAllEmails<\/code>. It will start extracting email addresses from all folders in your Gmail account and populating them in the Google Sheet.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getAllEmails<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">var<\/span> sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();\n  <span class=\"hljs-keyword\">var<\/span> emailAddresses = &#91;];\n  <span class=\"hljs-keyword\">var<\/span> row = <span class=\"hljs-number\">1<\/span>;\n\n  <span class=\"hljs-comment\">\/\/ Get all user labels<\/span>\n  <span class=\"hljs-keyword\">var<\/span> labels = GmailApp.getUserLabels();\n  \n  <span class=\"hljs-comment\">\/\/ Get all inbox threads separately<\/span>\n  <span class=\"hljs-keyword\">var<\/span> inboxThreads = GmailApp.getInboxThreads();\n  \n  <span class=\"hljs-comment\">\/\/ Function to process threads<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">processThreads<\/span>(<span class=\"hljs-params\">threads<\/span>) <\/span>{\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">var<\/span> j = <span class=\"hljs-number\">0<\/span>; j &lt; threads.length; j++) {\n      <span class=\"hljs-keyword\">var<\/span> messages = threads&#91;j].getMessages();\n      <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">var<\/span> k = <span class=\"hljs-number\">0<\/span>; k &lt; messages.length; k++) {\n        <span class=\"hljs-keyword\">var<\/span> <span class=\"hljs-keyword\">from<\/span> = messages&#91;k].getFrom();\n        <span class=\"hljs-keyword\">var<\/span> to = messages&#91;k].getTo();\n        <span class=\"hljs-keyword\">var<\/span> cc = messages&#91;k].getCc();\n        <span class=\"hljs-keyword\">var<\/span> bcc = messages&#91;k].getBcc();\n\n        <span class=\"hljs-keyword\">var<\/span> emails = extractEmails(<span class=\"hljs-keyword\">from<\/span>).concat(extractEmails(to), extractEmails(cc), extractEmails(bcc));\n        emails.forEach(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">email<\/span>) <\/span>{\n          <span class=\"hljs-keyword\">if<\/span> (emailAddresses.indexOf(email) === <span class=\"hljs-number\">-1<\/span>) {\n            emailAddresses.push(email);\n            sheet.getRange(row, <span class=\"hljs-number\">1<\/span>).setValue(email);\n            row++;\n          }\n        });\n      }\n    }\n  }\n\n  <span class=\"hljs-comment\">\/\/ Process inbox threads<\/span>\n  processThreads(inboxThreads);\n  \n  <span class=\"hljs-comment\">\/\/ Process threads in each user label<\/span>\n  <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">var<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; labels.length; i++) {\n    <span class=\"hljs-keyword\">var<\/span> threads = labels&#91;i].getThreads();\n    processThreads(threads);\n  }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">extractEmails<\/span>(<span class=\"hljs-params\">str<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">var<\/span> emails = &#91;];\n  <span class=\"hljs-keyword\">if<\/span> (str) {\n    <span class=\"hljs-keyword\">var<\/span> matches = str.match(<span class=\"hljs-regexp\">\/&#91;\\w.-]+@&#91;\\w.-]+\\.\\w+\/g<\/span>);\n    <span class=\"hljs-keyword\">if<\/span> (matches) {\n      emails = matches;\n    }\n  }\n  <span class=\"hljs-keyword\">return<\/span> emails;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The script exceeding the maximum execution time indicates that it is taking too long to process all the threads and messages in your Gmail account. To handle this, you can modify the script to process the emails in batches and use a script trigger to resume processing where it left off.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Modified Script to Process Emails in Batches:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Store Progress<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Use the Properties Service to store progress between executions.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Batch Processing<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Process a limited number of threads per execution to avoid exceeding the execution time limit.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Reschedule Execution<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Use a trigger to schedule the next batch if there are more threads to process.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getAllEmails<\/span>(<span class=\"hljs-params\"><\/span>) <\/span>{\n  <span class=\"hljs-keyword\">var<\/span> sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();\n  <span class=\"hljs-keyword\">var<\/span> properties = PropertiesService.getScriptProperties();\n  <span class=\"hljs-keyword\">var<\/span> emailAddresses = properties.getProperty(<span class=\"hljs-string\">'emailAddresses'<\/span>) ? <span class=\"hljs-built_in\">JSON<\/span>.parse(properties.getProperty(<span class=\"hljs-string\">'emailAddresses'<\/span>)) : &#91;];\n  <span class=\"hljs-keyword\">var<\/span> row = properties.getProperty(<span class=\"hljs-string\">'row'<\/span>) ? <span class=\"hljs-built_in\">parseInt<\/span>(properties.getProperty(<span class=\"hljs-string\">'row'<\/span>)) : <span class=\"hljs-number\">1<\/span>;\n  <span class=\"hljs-keyword\">var<\/span> labelIndex = properties.getProperty(<span class=\"hljs-string\">'labelIndex'<\/span>) ? <span class=\"hljs-built_in\">parseInt<\/span>(properties.getProperty(<span class=\"hljs-string\">'labelIndex'<\/span>)) : <span class=\"hljs-number\">0<\/span>;\n  <span class=\"hljs-keyword\">var<\/span> threadIndex = properties.getProperty(<span class=\"hljs-string\">'threadIndex'<\/span>) ? <span class=\"hljs-built_in\">parseInt<\/span>(properties.getProperty(<span class=\"hljs-string\">'threadIndex'<\/span>)) : <span class=\"hljs-number\">0<\/span>;\n  <span class=\"hljs-keyword\">var<\/span> processedThreads = <span class=\"hljs-number\">0<\/span>;\n  <span class=\"hljs-keyword\">var<\/span> BATCH_SIZE = <span class=\"hljs-number\">100<\/span>; <span class=\"hljs-comment\">\/\/ Number of threads to process per execution<\/span>\n  \n  <span class=\"hljs-comment\">\/\/ Get all user labels<\/span>\n  <span class=\"hljs-keyword\">var<\/span> labels = GmailApp.getUserLabels();\n  \n  <span class=\"hljs-comment\">\/\/ Get all inbox threads separately<\/span>\n  <span class=\"hljs-keyword\">var<\/span> inboxThreads = GmailApp.getInboxThreads();\n  \n  <span class=\"hljs-comment\">\/\/ Function to process threads<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">processThreads<\/span>(<span class=\"hljs-params\">threads<\/span>) <\/span>{\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">var<\/span> j = threadIndex; j &lt; threads.length &amp;&amp; processedThreads &lt; BATCH_SIZE; j++, processedThreads++) {\n      <span class=\"hljs-keyword\">var<\/span> messages = threads&#91;j].getMessages();\n      <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">var<\/span> k = <span class=\"hljs-number\">0<\/span>; k &lt; messages.length; k++) {\n        <span class=\"hljs-keyword\">var<\/span> <span class=\"hljs-keyword\">from<\/span> = messages&#91;k].getFrom();\n        <span class=\"hljs-keyword\">var<\/span> to = messages&#91;k].getTo();\n        <span class=\"hljs-keyword\">var<\/span> cc = messages&#91;k].getCc();\n        <span class=\"hljs-keyword\">var<\/span> bcc = messages&#91;k].getBcc();\n\n        <span class=\"hljs-keyword\">var<\/span> emails = extractEmails(<span class=\"hljs-keyword\">from<\/span>).concat(extractEmails(to), extractEmails(cc), extractEmails(bcc));\n        emails.forEach(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">email<\/span>) <\/span>{\n          <span class=\"hljs-keyword\">if<\/span> (emailAddresses.indexOf(email) === <span class=\"hljs-number\">-1<\/span>) {\n            emailAddresses.push(email);\n            sheet.getRange(row, <span class=\"hljs-number\">1<\/span>).setValue(email);\n            row++;\n          }\n        });\n      }\n    }\n    threadIndex = j;\n  }\n\n  <span class=\"hljs-comment\">\/\/ Process inbox threads<\/span>\n  <span class=\"hljs-keyword\">if<\/span> (labelIndex == <span class=\"hljs-number\">0<\/span>) {\n    processThreads(inboxThreads);\n  }\n\n  <span class=\"hljs-comment\">\/\/ Process threads in each user label<\/span>\n  <span class=\"hljs-keyword\">for<\/span> (; labelIndex &lt; labels.length &amp;&amp; processedThreads &lt; BATCH_SIZE; labelIndex++) {\n    <span class=\"hljs-keyword\">var<\/span> threads = labels&#91;labelIndex].getThreads();\n    processThreads(threads);\n    <span class=\"hljs-keyword\">if<\/span> (threadIndex &lt; threads.length) {\n      <span class=\"hljs-keyword\">break<\/span>;\n    } <span class=\"hljs-keyword\">else<\/span> {\n      threadIndex = <span class=\"hljs-number\">0<\/span>;\n    }\n  }\n\n  <span class=\"hljs-comment\">\/\/ Store progress<\/span>\n  properties.setProperty(<span class=\"hljs-string\">'emailAddresses'<\/span>, <span class=\"hljs-built_in\">JSON<\/span>.stringify(emailAddresses));\n  properties.setProperty(<span class=\"hljs-string\">'row'<\/span>, row);\n  properties.setProperty(<span class=\"hljs-string\">'labelIndex'<\/span>, labelIndex);\n  properties.setProperty(<span class=\"hljs-string\">'threadIndex'<\/span>, threadIndex);\n\n  <span class=\"hljs-comment\">\/\/ Reschedule if there are more threads to process<\/span>\n  <span class=\"hljs-keyword\">if<\/span> (labelIndex &lt; labels.length || threadIndex &lt; inboxThreads.length) {\n    ScriptApp.newTrigger(<span class=\"hljs-string\">'getAllEmails'<\/span>)\n      .timeBased()\n      .after(<span class=\"hljs-number\">1<\/span> * <span class=\"hljs-number\">60<\/span> * <span class=\"hljs-number\">1000<\/span>) <span class=\"hljs-comment\">\/\/ Run after 1 minute<\/span>\n      .create();\n  } <span class=\"hljs-keyword\">else<\/span> {\n    <span class=\"hljs-comment\">\/\/ Clear properties after completion<\/span>\n    properties.deleteAllProperties();\n  }\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">extractEmails<\/span>(<span class=\"hljs-params\">str<\/span>) <\/span>{\n  <span class=\"hljs-keyword\">var<\/span> emails = &#91;];\n  <span class=\"hljs-keyword\">if<\/span> (str) {\n    <span class=\"hljs-keyword\">var<\/span> matches = str.match(<span class=\"hljs-regexp\">\/&#91;\\w.-]+@&#91;\\w.-]+\\.\\w+\/g<\/span>);\n    <span class=\"hljs-keyword\">if<\/span> (matches) {\n      emails = matches;\n    }\n  }\n  <span class=\"hljs-keyword\">return<\/span> emails;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>","protected":false},"excerpt":{"rendered":"<p>Method 1: Using Google Apps Script The script exceeding the maximum execution time indicates that it is taking too long [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-261","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts\/261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/comments?post=261"}],"version-history":[{"count":3,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts\/261\/revisions"}],"predecessor-version":[{"id":265,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/posts\/261\/revisions\/265"}],"wp:attachment":[{"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/media?parent=261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/categories?post=261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rajeshkumar.xyz\/blog\/wp-json\/wp\/v2\/tags?post=261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}