<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Onformsubmit on Tarragon</title><link>https://tarrragon.github.io/blog/tags/onformsubmit/</link><description>Recent content in Onformsubmit on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Mon, 06 Jul 2026 00:00:00 +0800</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/onformsubmit/index.xml" rel="self" type="application/rss+xml"/><item><title>表單與事件觸發器</title><link>https://tarrragon.github.io/blog/automation/04-triggers-automation/form-and-event-triggers/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/automation/04-triggers-automation/form-and-event-triggers/</guid><description>&lt;p>事件觸發器讓 Apps Script 在「某個 Google 檔案發生某件事」的當下自動執行，跟時間觸發器的「到點就跑」互補。最常用的是 &lt;code>onFormSubmit&lt;/code>（有人提交 Google 表單）跟 &lt;code>onEdit&lt;/code>（有人編輯試算表）。這一篇講事件觸發器能做什麼、以及一個容易踩的權限分界。&lt;/p>
&lt;h2 id="onformsubmit表單提交即時處理">onFormSubmit：表單提交即時處理&lt;/h2>
&lt;p>Google 表單本身會把回應存進一張試算表，但「存進去之後要做什麼」需要 Apps Script。&lt;code>onFormSubmit&lt;/code> 觸發器在每次有人提交表單時執行，拿得到這次提交的內容：&lt;/p>





&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">&lt;span class="kd">function&lt;/span> &lt;span class="nx">onFormSubmit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">e&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">2&lt;/span>&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">answers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">e&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">namedValues&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// { &amp;#34;Email&amp;#34;: [&amp;#34;a@b.com&amp;#34;], &amp;#34;問題&amp;#34;: [&amp;#34;內容&amp;#34;] }
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">3&lt;/span>&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// 例如：寄一封通知信給自己
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">4&lt;/span>&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="nx">MailApp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sendEmail&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;you@gmail.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;新表單回應&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">JSON&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">stringify&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">answers&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="ln">5&lt;/span>&lt;span class="cl">&lt;span class="p">}&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>這讓表單從「被動收集」變成「即時反應」——提交當下就寄通知、寫進別的表、或呼叫外部 API。對 blog 的延伸應用，例如做一個「訂閱通知」或「回饋表單」，&lt;code>onFormSubmit&lt;/code> 是接手處理的入口。要注意 &lt;code>MailApp.sendEmail&lt;/code> 受每日寄信配額約束（個人帳號每天 100 封收件人，見&lt;a href="https://tarrragon.github.io/blog/automation/knowledge-cards/execution-quota/" data-link-title="Execution Quota（執行配額）" data-link-desc="Apps Script 個人帳號的執行時間、同時併發與觸發器每日總時間上限，決定免費膠水層能承受多大的量">執行配額&lt;/a>），高頻通知要留意。&lt;/p>
&lt;h2 id="onedit試算表被編輯">onEdit：試算表被編輯&lt;/h2>
&lt;p>&lt;code>onEdit&lt;/code> 在試算表任何一格被改動時觸發，拿得到改了哪一格、新值是什麼。它適合「維護試算表內部的衍生狀態」，例如某欄被填值時自動在旁邊算出對應結果。對流量統計這條主線用得不多，但它是 Sheets 自動化的常見工具，值得知道它存在。&lt;/p>
&lt;h2 id="simple-與-installable一個權限分界">simple 與 installable：一個權限分界&lt;/h2>
&lt;p>事件觸發器有兩種形式，差別在&lt;strong>能不能做需要授權的事&lt;/strong>，這是容易踩的分界。&lt;/p>
&lt;p>&lt;strong>Simple 觸發器&lt;/strong>是靠函式命名約定自動生效的：把函式命名為 &lt;code>onOpen&lt;/code>、&lt;code>onEdit&lt;/code> 這些保留名字，不必註冊就會在對應事件觸發。代價是它跑在受限環境裡——&lt;strong>不能做需要授權的操作&lt;/strong>，例如寄信、呼叫外部 URL、存取其他檔案。它適合純粹在當前檔案內、不碰外部的輕量反應。&lt;/p>
&lt;p>&lt;strong>Installable 觸發器&lt;/strong>是明確註冊的（用 &lt;code>ScriptApp.newTrigger(...).forSpreadsheet(...).onEdit().create()&lt;/code>，或在觸發條件介面建立），它以你的授權身分執行，&lt;strong>能做需要權限的操作&lt;/strong>（寄信、UrlFetch、跨檔案）。&lt;code>onFormSubmit&lt;/code> 要做寄信這類事，必須是 installable 的。&lt;/p>
&lt;p>判準很直接：&lt;strong>這個事件處理要不要碰當前檔案以外的東西&lt;/strong>——不要（只在表內算個值），simple 夠用；要（寄信、打 API、寫別的表），得用 installable。踩雷的典型情境是「我寫了一個 &lt;code>onFormSubmit&lt;/code> 想寄通知信，怎麼都沒寄出」——因為它被當成 simple 觸發器、而 simple 不能寄信；改成明確註冊的 installable 就好。&lt;/p>
&lt;h2 id="下一步">下一步&lt;/h2>
&lt;p>觸發器（時間的與事件的）把統計從「手動查」變成「自動跑」。整套統計上線後怎麼守住配額、擋濫用、保持資料乾淨，見&lt;a href="https://tarrragon.github.io/blog/automation/05-deploy-quota-security/" data-link-title="模組五：部署、配額與安全" data-link-desc="把匿名可存取的 beacon 接收端上線後，怎麼守住免費配額、擋掉濫用、保持資料乾淨、以及判斷何時該換更重的工具">模組五：部署、配額與安全&lt;/a>。&lt;/p></description><content:encoded><![CDATA[<p>事件觸發器讓 Apps Script 在「某個 Google 檔案發生某件事」的當下自動執行，跟時間觸發器的「到點就跑」互補。最常用的是 <code>onFormSubmit</code>（有人提交 Google 表單）跟 <code>onEdit</code>（有人編輯試算表）。這一篇講事件觸發器能做什麼、以及一個容易踩的權限分界。</p>
<h2 id="onformsubmit表單提交即時處理">onFormSubmit：表單提交即時處理</h2>
<p>Google 表單本身會把回應存進一張試算表，但「存進去之後要做什麼」需要 Apps Script。<code>onFormSubmit</code> 觸發器在每次有人提交表單時執行，拿得到這次提交的內容：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-javascript" data-lang="javascript"><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">function</span> <span class="nx">onFormSubmit</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">  <span class="kd">var</span> <span class="nx">answers</span> <span class="o">=</span> <span class="nx">e</span><span class="p">.</span><span class="nx">namedValues</span><span class="p">;</span>        <span class="c1">// { &#34;Email&#34;: [&#34;a@b.com&#34;], &#34;問題&#34;: [&#34;內容&#34;] }
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="c1"></span>  <span class="c1">// 例如：寄一封通知信給自己
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="c1"></span>  <span class="nx">MailApp</span><span class="p">.</span><span class="nx">sendEmail</span><span class="p">(</span><span class="s2">&#34;you@gmail.com&#34;</span><span class="p">,</span> <span class="s2">&#34;新表單回應&#34;</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">answers</span><span class="p">));</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>這讓表單從「被動收集」變成「即時反應」——提交當下就寄通知、寫進別的表、或呼叫外部 API。對 blog 的延伸應用，例如做一個「訂閱通知」或「回饋表單」，<code>onFormSubmit</code> 是接手處理的入口。要注意 <code>MailApp.sendEmail</code> 受每日寄信配額約束（個人帳號每天 100 封收件人，見<a href="/blog/automation/knowledge-cards/execution-quota/" data-link-title="Execution Quota（執行配額）" data-link-desc="Apps Script 個人帳號的執行時間、同時併發與觸發器每日總時間上限，決定免費膠水層能承受多大的量">執行配額</a>），高頻通知要留意。</p>
<h2 id="onedit試算表被編輯">onEdit：試算表被編輯</h2>
<p><code>onEdit</code> 在試算表任何一格被改動時觸發，拿得到改了哪一格、新值是什麼。它適合「維護試算表內部的衍生狀態」，例如某欄被填值時自動在旁邊算出對應結果。對流量統計這條主線用得不多，但它是 Sheets 自動化的常見工具，值得知道它存在。</p>
<h2 id="simple-與-installable一個權限分界">simple 與 installable：一個權限分界</h2>
<p>事件觸發器有兩種形式，差別在<strong>能不能做需要授權的事</strong>，這是容易踩的分界。</p>
<p><strong>Simple 觸發器</strong>是靠函式命名約定自動生效的：把函式命名為 <code>onOpen</code>、<code>onEdit</code> 這些保留名字，不必註冊就會在對應事件觸發。代價是它跑在受限環境裡——<strong>不能做需要授權的操作</strong>，例如寄信、呼叫外部 URL、存取其他檔案。它適合純粹在當前檔案內、不碰外部的輕量反應。</p>
<p><strong>Installable 觸發器</strong>是明確註冊的（用 <code>ScriptApp.newTrigger(...).forSpreadsheet(...).onEdit().create()</code>，或在觸發條件介面建立），它以你的授權身分執行，<strong>能做需要權限的操作</strong>（寄信、UrlFetch、跨檔案）。<code>onFormSubmit</code> 要做寄信這類事，必須是 installable 的。</p>
<p>判準很直接：<strong>這個事件處理要不要碰當前檔案以外的東西</strong>——不要（只在表內算個值），simple 夠用；要（寄信、打 API、寫別的表），得用 installable。踩雷的典型情境是「我寫了一個 <code>onFormSubmit</code> 想寄通知信，怎麼都沒寄出」——因為它被當成 simple 觸發器、而 simple 不能寄信；改成明確註冊的 installable 就好。</p>
<h2 id="下一步">下一步</h2>
<p>觸發器（時間的與事件的）把統計從「手動查」變成「自動跑」。整套統計上線後怎麼守住配額、擋濫用、保持資料乾淨，見<a href="/blog/automation/05-deploy-quota-security/" data-link-title="模組五：部署、配額與安全" data-link-desc="把匿名可存取的 beacon 接收端上線後，怎麼守住免費配額、擋掉濫用、保持資料乾淨、以及判斷何時該換更重的工具">模組五：部署、配額與安全</a>。</p>
]]></content:encoded></item></channel></rss>