<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: All Stacks Developer</title>
    <description>The latest articles on DEV Community by All Stacks Developer (@all_stacks_developer).</description>
    <link>https://dev.to/all_stacks_developer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F664415%2F0ef21a2b-2958-4683-bc17-cf101090d9bd.png</url>
      <title>DEV Community: All Stacks Developer</title>
      <link>https://dev.to/all_stacks_developer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/all_stacks_developer"/>
    <language>en</language>
    <item>
      <title>Make any JavaScript method available in Google Sheets</title>
      <dc:creator>All Stacks Developer</dc:creator>
      <pubDate>Fri, 30 Sep 2022 20:15:42 +0000</pubDate>
      <link>https://dev.to/all_stacks_developer/make-any-javascript-method-available-in-google-sheets-16ad</link>
      <guid>https://dev.to/all_stacks_developer/make-any-javascript-method-available-in-google-sheets-16ad</guid>
      <description>&lt;p&gt;Many functions in Google Sheets return an array as the result. However, I find that there is a lack of built-in support functions in Google Sheets when working with an array. &lt;/p&gt;

&lt;p&gt;In JavaScript, there is the SLICE method that can return a part of an array. If I have an array &lt;code&gt;const pricesWithHeader = ['Close', 10.5, 10.3, 10.1, 10.0];&lt;/code&gt;, to get only the last 4 elements &lt;code&gt;[10.5, 10.3, 10.1, 10.0]&lt;/code&gt;, I can apply the SLICE method like &lt;code&gt;const pricesWithoutHeader = pricesWithHeader.slice(1)&lt;/code&gt;;. How to slice an array in Google Sheets?&lt;/p&gt;

&lt;p&gt;Google Sheets has scripting capability with Apps Script based on JavaScript. So to slice an array in Google Sheets, I need to create a SLICE method in Apps Script that wraps the original SLICE method of JavaScript. By doing so, the SLICE function is available to use in every cell of a spreadsheet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihdnrdcw70ljrx1i2o7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihdnrdcw70ljrx1i2o7c.png" alt="Slice array in Google Sheets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source code and the demo can be found in the blog post&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/2022/09/slice-array-in-google-sheets.html" rel="noopener noreferrer"&gt;https://www.allstacksdeveloper.com/2022/09/slice-array-in-google-sheets.html&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Use SPARKLINE column chart to create price chart with reference price
&lt;/h3&gt;

&lt;p&gt;I own and follow several stocks in my investment portfolio. I pick a reference price for each stock. To effectively track the movement of a stock, I need to visualize its 52-week prices based on the reference price that I determined. In this post, I explain how to do so with the SPARKLINE column chart in Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/2022/10/sparkline-column-chart-google-finance.html" rel="noopener noreferrer"&gt;https://www.allstacksdeveloper.com/2022/10/sparkline-column-chart-google-finance.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgu1vjvwdapbq6c6dweyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgu1vjvwdapbq6c6dweyu.png" alt="Use SPARKLINE column chart to show stock price trend in Google Sheets"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>appscript</category>
      <category>googlesheets</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to convert column index of a spreadsheet into letters</title>
      <dc:creator>All Stacks Developer</dc:creator>
      <pubDate>Tue, 25 Jan 2022 07:38:24 +0000</pubDate>
      <link>https://dev.to/all_stacks_developer/how-to-convert-column-index-of-a-spreadsheet-into-letters-31k0</link>
      <guid>https://dev.to/all_stacks_developer/how-to-convert-column-index-of-a-spreadsheet-into-letters-31k0</guid>
      <description>&lt;p&gt;In a spreadsheet, rows are indexed numerically, starting from 1, but columns are indexed alphabetically, starting from A. Hence, it is pretty straightforward to work with rows and trickier to work with columns as we need to convert between column index and corresponding letters. For example, what are the letters of column 999th in a spreadsheet? In this post, we will look at how to convert programmatically a column index into its corresponding letters.&lt;/p&gt;

&lt;p&gt;In a spreadsheet, columns are indexed alphabetically, starting from A.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Obviously, the first 26 columns correspond to 26 alphabet characters, A to Z.&lt;/li&gt;
&lt;li&gt;The next 676 columns (&lt;strong&gt;26*26&lt;/strong&gt;), from 27th to 702nd, are indexed with 2 letters. [AA, AB, ... AY, AZ], [BA, BB, ... BY, BZ], ... [MA, MB, ... MY, MZ], ... [ZA, ZB, ... ZY, ZZ]. Each alphabet character takes a turn (in order) to precede all 26 alphabet characters.&lt;/li&gt;
&lt;li&gt;The next 17576 columns (&lt;strong&gt;26*26*26&lt;/strong&gt;), from 703rd to 18278th, are indexed with 3 letters. [AAA, AAB, ... AAY, AAZ], [ABA, ABB, ... ABY, ABZ], ... [ZZA, ZZB, ... ZZY, ZZZ]. Each letter AA to ZZ above takes a turn (in order) to precede all 26 alphabet characters.&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above observation suggests a recursive pattern. Columns with 3 letters depend on columns with 2 letters, columns with 2 letters depend on columns with 1 letter. Moreover, the number of letters for a column depends on its index divided by 26. It suggests that we need to divide column index by 26 to apply the recursive pattern. So, here are the steps of the algorithm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;let ALPHABETS=['A', 'B', 'C', 'D', ... 'X', 'Y', 'Z']&lt;/li&gt;
&lt;li&gt;if k &amp;lt;= 26, then return &lt;strong&gt;ALPHABETS[k - 1]&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;else return &lt;strong&gt;getColumnLetters(k / 26)&lt;/strong&gt; + &lt;strong&gt;ALPHABETS[(k % 26) - 1]&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;Column Index&lt;/td&gt;
&lt;td&gt;Column Letters&lt;/td&gt;
&lt;td&gt;Divide by 26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;=12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;=13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;td&gt;=26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;AA&lt;/td&gt;
&lt;td&gt;=1*26+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;AK&lt;/td&gt;
&lt;td&gt;=1*26+11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;AL&lt;/td&gt;
&lt;td&gt;=1*26+12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;BA&lt;/td&gt;
&lt;td&gt;=2*26+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;BW&lt;/td&gt;
&lt;td&gt;=2*26+23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;988&lt;/td&gt;
&lt;td&gt;AKZ&lt;/td&gt;
&lt;td&gt;=37*26+26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;989&lt;/td&gt;
&lt;td&gt;ALA&lt;/td&gt;
&lt;td&gt;=38*26+1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1390&lt;/td&gt;
&lt;td&gt;BAL&lt;/td&gt;
&lt;td&gt;=53*26+12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1963&lt;/td&gt;
&lt;td&gt;BWM&lt;/td&gt;
&lt;td&gt;=75*26+13&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let's take the column 1963rd as an example: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As &lt;strong&gt;1963=75*26+13&lt;/strong&gt;, the 1963rd column letters are the concatenation of the 75th column letters and the 13th column letters.

&lt;ul&gt;
&lt;li&gt;As &lt;strong&gt;13 &amp;lt; 26&lt;/strong&gt;, the 13rd column's letter is the 13rd alphabet character that is &lt;strong&gt;M&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;As &lt;strong&gt;75 = 2 * 26 + 23&lt;/strong&gt;, the 75th column letters are the concatenation of the 2nd column letters and the 23rd column letters.&lt;/li&gt;
&lt;li&gt;As &lt;strong&gt;2 &amp;lt; 26&lt;/strong&gt;, the 2nd column letter is the 2nd alphabet character that is &lt;strong&gt;B&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;As &lt;strong&gt;23 &amp;lt; 26&lt;/strong&gt;, the 23rd column letter is the 23rd alphabet character that is &lt;strong&gt;W&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The 75th column letters are hence &lt;strong&gt;B&lt;/strong&gt; + &lt;strong&gt;W&lt;/strong&gt; = &lt;strong&gt;BW&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The 1963rd column letters are hence &lt;strong&gt;BW&lt;/strong&gt; + &lt;strong&gt;M&lt;/strong&gt; = &lt;strong&gt;BWM&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Let's analyze the column 988th that is a little bit trickier because 988 is divisible by 26:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As &lt;strong&gt;988=38*26+0&lt;/strong&gt;, the 988th column letters are the concatenation of the 38th column letters and the 0th column letters. &lt;strong&gt;But wait, column index starts from 1, doesn't it?&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;In fact, as 988 is divisible by 26, it can be expressed as &lt;strong&gt;988=37*26+26&lt;/strong&gt;. That means the 988th column letters are the concatenation of the 37th column letters and the 26th column letters.&lt;/li&gt;
&lt;li&gt;As &lt;strong&gt;26 = 26&lt;/strong&gt;, the 26th column letter is the 26th alphabet character that is &lt;strong&gt;Z&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;As &lt;strong&gt;37 = 1 * 26 + 11&lt;/strong&gt;, the 37th column letters are the concatenation of the 1st column's letter and the 11th column's letter.&lt;/li&gt;
&lt;li&gt;Because, &lt;strong&gt;1 &amp;lt; 26&lt;/strong&gt;, the 1st column letter is the 1st alphabet character that is &lt;strong&gt;A&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;As &lt;strong&gt;11 &amp;lt; 26&lt;/strong&gt;, the 11th column letter is the 11th alphabet character that is &lt;strong&gt;K&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The 37th column letters are hence &lt;strong&gt;A&lt;/strong&gt; + &lt;strong&gt;K&lt;/strong&gt; = &lt;strong&gt;AK&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The 988th column letters are hence &lt;strong&gt;AK&lt;/strong&gt; + &lt;strong&gt;Z&lt;/strong&gt; = &lt;strong&gt;AKZ&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;To implement this algorithm in javascript, we need to pay attention to certain points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The column index, which is the input of the function, starts from 1, while the array in javascript starts from 0.&lt;/li&gt;
&lt;li&gt;When dividing the column index by 26, we need to round the result down.&lt;/li&gt;
&lt;li&gt;If the column index is divisible by 26, the residual is 0. To apply the next recursive call, we need to reduce the result by one while increasing the residual by 26.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, you can find below an example of code to convert column index into corresponding letters in javascript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getColumnLetters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;columnIndexStartFromOne&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ALPHABETS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;D&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;E&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;F&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;G&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;H&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;J&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;K&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;L&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;N&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;O&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;P&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Q&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;R&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;S&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;T&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;U&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;V&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;W&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Y&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Z&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;columnIndexStartFromOne&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ALPHABETS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;columnIndexStartFromOne&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;columnIndexStartFromOne&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;columnIndexStartFromOne&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getColumnLetters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;ALPHABETS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to create personal stock portfolio tracker with Google Sheets, Google Apps Script and Google Data Studio
&lt;/h2&gt;

&lt;p&gt;In this post I explain how to create a beautiful personal stock portfolio tracker with Google Sheets, Google Apps Script and Google Data Studio, please check out &lt;a href="https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html" rel="noopener noreferrer"&gt;this post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-fJaQmukBW40/YHdGI2pc67I/AAAAAAAAALI/x27ehQa3IDo7xHlCF6xlo2EPOSu8RfcPwCPcBGAsYHg/s1910/Screenshot%2B2021-04-14%2Bat%2B21.42.39.png" rel="noopener noreferrer"&gt;&lt;img alt="LION stock portfolio tracker dashboard in Google Data Studio" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F1.bp.blogspot.com%2F-fJaQmukBW40%2FYHdGI2pc67I%2FAAAAAAAAALI%2Fx27ehQa3IDo7xHlCF6xlo2EPOSu8RfcPwCPcBGAsYHg%2Fw605-h640%2FScreenshot%252B2021-04-14%252Bat%252B21.42.39.png" title="LION stock portfolio tracker dashboard in Google Data Studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html" rel="noopener noreferrer"&gt;https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create dividend income tracker with Google Sheets and Google Data Studio
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://www.allstacksdeveloper.com/2021/11/create-dividend-tracker-with-google-sheets.html" rel="noopener noreferrer"&gt;this post&lt;/a&gt;, I explain how to create a dividend income tracker by simply using pivot tables of Google Sheets.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://www.allstacksdeveloper.com/2021/12/create-dividend-income-tracker-google-data-studio.html" rel="noopener noreferrer"&gt;this post&lt;/a&gt;, I explain how to create a dividend income tracker with Google Data Studio. &lt;/p&gt;

&lt;p&gt;Don't forget to check them out!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/2021/11/create-dividend-tracker-with-google-sheets.html" rel="noopener noreferrer"&gt;https://www.allstacksdeveloper.com/2021/11/create-dividend-tracker-with-google-sheets.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/2021/12/create-dividend-income-tracker-google-data-studio.html" rel="noopener noreferrer"&gt;https://www.allstacksdeveloper.com/2021/12/create-dividend-income-tracker-google-data-studio.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjwxlvp9pai4b4mq8313.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgjwxlvp9pai4b4mq8313.png" alt="Create dividend income tracker with Google Data Studio"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>googlesheets</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Create Dividend Tracker With Google Sheets </title>
      <dc:creator>All Stacks Developer</dc:creator>
      <pubDate>Tue, 23 Nov 2021 21:18:34 +0000</pubDate>
      <link>https://dev.to/all_stacks_developer/create-dividend-tracker-with-google-sheets-h1o</link>
      <guid>https://dev.to/all_stacks_developer/create-dividend-tracker-with-google-sheets-h1o</guid>
      <description>&lt;p&gt;As my investment strategy is to buy stocks that pay regular and stable dividends during a long-term period, I need to monitor my dividends income by stocks, by months, and by years, so that I can answer quickly and exactly the following questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much dividend did I receive on a given month and a given year?&lt;/li&gt;
&lt;li&gt;How much dividend did I receive for a given stock in a given year?&lt;/li&gt;
&lt;li&gt;Have a given stock's annual dividend per share kept increasing gradually over years?&lt;/li&gt;
&lt;li&gt;Have a given stock's annual dividend yield been stable over years?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this post, I explain how to create a dividend tracker with Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/2021/11/create-dividend-tracker-with-google-sheets.html"&gt;Create Dividend Tracker With Google Sheets&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>googlesheets</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Stock correlation analysis with Google Sheets</title>
      <dc:creator>All Stacks Developer</dc:creator>
      <pubDate>Tue, 23 Nov 2021 21:14:45 +0000</pubDate>
      <link>https://dev.to/all_stacks_developer/stock-correlation-analysis-with-google-sheets-35e5</link>
      <guid>https://dev.to/all_stacks_developer/stock-correlation-analysis-with-google-sheets-35e5</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BMYq3pxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1fbboksi7c5bp5t0spkc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BMYq3pxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1fbboksi7c5bp5t0spkc.jpeg" alt="Alt Text" width="880" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Correlation is a statistical relationship that measures how related the movement of one variable is compared to another variable. For example, stock prices fluctuate over time and are correlated accordingly or inversely to one another. Understanding stock correlation and being able to perform analysis are very helpful in managing a stock portfolio investment. In this post, we will look at how to perform stock correlation analysis with Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/2021/08/stock-correlation-analysis-with-google-sheets.html"&gt;Stock correlation analysis with Google Sheets&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>googlesheets</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to copy data in Google Sheets as HTML table</title>
      <dc:creator>All Stacks Developer</dc:creator>
      <pubDate>Tue, 13 Jul 2021 16:39:58 +0000</pubDate>
      <link>https://dev.to/all_stacks_developer/how-to-copy-data-in-google-sheets-as-html-table-2332</link>
      <guid>https://dev.to/all_stacks_developer/how-to-copy-data-in-google-sheets-as-html-table-2332</guid>
      <description>&lt;p&gt;I often need to extract some sample data in Google Sheets and present it in my blog as an HTML table. However, when copying a selected range in Google Sheets and paste it outside the Google Sheets, I only get plain text. In this post, I explain how to copy data in Google Sheets as an HTML table by writing a small Apps Script program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-H4_aIGJEO34/YK6k6YX103I/AAAAAAAAAPA/52vt1x8LtdU_i5u-IhIUcVjpNAWJv3MawCPcBGAsYHg/s2524/Screenshot%2B2021-05-26%2Bat%2B21.39.54.png" rel="noopener noreferrer"&gt;&lt;img alt="Copy sheets as HTML table" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F1.bp.blogspot.com%2F-H4_aIGJEO34%2FYK6k6YX103I%2FAAAAAAAAAPA%2F52vt1x8LtdU_i5u-IhIUcVjpNAWJv3MawCPcBGAsYHg%2Fw640-h330%2FScreenshot%252B2021-05-26%252Bat%252B21.39.54.png" title="Copy sheets as HTML table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Concept
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Write a small Apps Script program &lt;code&gt;copyAsHTMLTable()&lt;/code&gt; to transform the selected range in the active sheet into a HTML code for table&lt;/li&gt;
&lt;li&gt;According to Apps Script documentation, &lt;a href="https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app#getactiverange" rel="noopener noreferrer"&gt;getActiveRange()&lt;/a&gt; returns the selected range in the active sheet.&lt;/li&gt;
&lt;li&gt;According to Apps Script documentation, &lt;a href="https://developers.google.com/apps-script/reference/spreadsheet/range#getDisplayValues()" rel="noopener noreferrer"&gt;getDisplayValues()&lt;/a&gt; returns the rectangular grid of values for a range.&lt;/li&gt;
&lt;li&gt;From the rectangular grid of values: 

&lt;ul&gt;
&lt;li&gt;Use 2 &lt;code&gt;for&lt;/code&gt; loops to iterate row by row and then column by column&lt;/li&gt;
&lt;li&gt;Each row is wrapped in a HTML row tag &lt;code&gt;&amp;lt;tr&amp;gt;&amp;lt;/tr&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Each column is wrapped in a HTML column tag &lt;code&gt;&amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Present the HTML table code in a dialog so that user can copy it manually&lt;/li&gt;

&lt;li&gt;Add the program &lt;code&gt;copyAsHTMLTable()&lt;/code&gt; to a menu on the toolbar to easily run it&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Source Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/allstacksdeveloper/834d0dabec494e08d9719473fd15bc87.js" rel="noopener noreferrer"&gt;https://gist.github.com/allstacksdeveloper/834d0dabec494e08d9719473fd15bc87.js&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  LION Stock Portfolio Tracker
&lt;/h2&gt;

&lt;p&gt;If you want to learn more how to use Google Sheets and Google Apps Script to manage stock portfolio investment, please check out &lt;a href="https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html" rel="noopener noreferrer"&gt;LION stock portfolio tracker guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://1.bp.blogspot.com/-fJaQmukBW40/YHdGI2pc67I/AAAAAAAAALI/x27ehQa3IDo7xHlCF6xlo2EPOSu8RfcPwCPcBGAsYHg/s1910/Screenshot%2B2021-04-14%2Bat%2B21.42.39.png" rel="noopener noreferrer"&gt;&lt;img alt="LION stock portfolio tracker dashboard in Google Data Studio" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F1.bp.blogspot.com%2F-fJaQmukBW40%2FYHdGI2pc67I%2FAAAAAAAAALI%2Fx27ehQa3IDo7xHlCF6xlo2EPOSu8RfcPwCPcBGAsYHg%2Fw605-h640%2FScreenshot%252B2021-04-14%252Bat%252B21.42.39.png" title="LION stock portfolio tracker dashboard in Google Data Studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html" rel="noopener noreferrer"&gt;https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>tutorial</category>
      <category>appscript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Create personal stock portfolio tracker with Google Sheets and Google Data Studio</title>
      <dc:creator>All Stacks Developer</dc:creator>
      <pubDate>Sat, 10 Jul 2021 16:37:04 +0000</pubDate>
      <link>https://dev.to/all_stacks_developer/create-personal-stock-portfolio-tracker-with-google-sheets-and-google-data-studio-31e2</link>
      <guid>https://dev.to/all_stacks_developer/create-personal-stock-portfolio-tracker-with-google-sheets-and-google-data-studio-31e2</guid>
      <description>&lt;p&gt;The idea is to take advantage of what Google Sheets and Google Data Studio offer and pull them together to build a personal stock portfolio tracker.&lt;/p&gt;

&lt;p&gt;We can think of a spreadsheet as a database to register transactions made along with a stock portfolio investment. To track the portfolio’s evolution, we need to know the prices of owned stocks and that is exactly what is offered by GOOGLEFINANCE function. We can register the transactions in a sheet and use the pivot table, built-in functions such as GOOGLEFINANCE, and Apps Script to automate the computation for daily evolution of the portfolio as well as the current position for each stock in the portfolio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkuaxo0c9y4bimf495s7f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkuaxo0c9y4bimf495s7f.png" alt="Manage Stock Transactions With Google Sheets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpxtqkgvhfr0npbpy0bj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpxtqkgvhfr0npbpy0bj.png" alt="Compute daily evolution of a stock portfolio with Google Sheets and Apps Script"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can then use Google Data Studio to build an interactive dashboard with data from spreadsheet. Google Data Studio provides a built-in connector to Google Sheets to fetch data stored in spreadsheets and visualize them in many beautiful and interactive charts. We can effectively draw charts directly within the spreadsheet but I find it inconvenient to have charts overlapped the data and it is better to separate them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c2q5e3gych9gn2wpg9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c2q5e3gych9gn2wpg9h.png" alt="Create personal stock portfolio tracker with Google Sheets and Google Data Studio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can follow the &lt;a href="https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html" rel="noopener noreferrer"&gt;LION stock portfolio tracker guide&lt;/a&gt; to create your own personal stock portfolio tracker with Google Sheets and Google Data Studio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html" rel="noopener noreferrer"&gt;https://www.allstacksdeveloper.com/p/lion-stock-portfolio-tracker.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>appscript</category>
      <category>showdev</category>
      <category>googlesheets</category>
      <category>googledatastudio</category>
    </item>
  </channel>
</rss>
