<?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>Web-App on Tarragon</title><link>https://tarrragon.github.io/blog/tags/web-app/</link><description>Recent content in Web-App 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/web-app/index.xml" rel="self" type="application/rss+xml"/><item><title>Web App Deployment（Web App 部署）</title><link>https://tarrragon.github.io/blog/automation/knowledge-cards/web-app-deployment/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/automation/knowledge-cards/web-app-deployment/</guid><description>&lt;p>Web app 部署是把一段 Apps Script 程式掛成「有公開網址、可被 HTTP 呼叫」的端點的動作。部署前程式只能在編輯器裡手動執行；部署後它得到一個 &lt;code>https://script.google.com/macros/s/.../exec&lt;/code> 網址，任何符合存取權限的請求打這個網址就會觸發 &lt;a href="https://tarrragon.github.io/blog/automation/knowledge-cards/doget-dopost/" data-link-title="doGet / doPost" data-link-desc="Apps Script web app 的兩個進入點函式，分別接住 GET 與 POST 請求，決定端點收到請求時執行什麼">doGet 或 doPost&lt;/a>。這是讓 Apps Script 能當 &lt;a href="https://tarrragon.github.io/blog/automation/knowledge-cards/beacon/" data-link-title="Beacon" data-link-desc="瀏覽器在頁面事件發生時主動送出、送出後不等回應的一則事件回報請求，用於靜態站把資料回傳給接收端">beacon&lt;/a> 接收端的前提。&lt;/p>
&lt;h2 id="概念位置">概念位置&lt;/h2>
&lt;p>部署有兩個決定端點行為的設定。&lt;strong>執行身分（execute as）&lt;/strong> 決定程式用誰的權限跑：選「我」時，匿名訪客送來的請求也用你的身分執行，才能存取你的試算表。&lt;strong>誰可存取（who has access）&lt;/strong> 決定誰能呼叫這個網址：接收匿名訪客的 &lt;a href="https://tarrragon.github.io/blog/automation/knowledge-cards/beacon/" data-link-title="Beacon" data-link-desc="瀏覽器在頁面事件發生時主動送出、送出後不等回應的一則事件回報請求，用於靜態站把資料回傳給接收端">beacon&lt;/a> 必須選「所有人」，因為訪客沒有登入 Google。&lt;/p>
&lt;h2 id="可觀察訊號與例子">可觀察訊號與例子&lt;/h2>
&lt;p>一個實務要點是部署與網址的關係：每次「新增部署作業」會產生一個新網址，但改完程式後應該用「管理部署作業」更新既有部署，網址才不變。用錯方式會讓前端指向舊網址、以為程式沒生效。&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>Web app 部署是把一段 Apps Script 程式掛成「有公開網址、可被 HTTP 呼叫」的端點的動作。部署前程式只能在編輯器裡手動執行；部署後它得到一個 <code>https://script.google.com/macros/s/.../exec</code> 網址，任何符合存取權限的請求打這個網址就會觸發 <a href="/blog/automation/knowledge-cards/doget-dopost/" data-link-title="doGet / doPost" data-link-desc="Apps Script web app 的兩個進入點函式，分別接住 GET 與 POST 請求，決定端點收到請求時執行什麼">doGet 或 doPost</a>。這是讓 Apps Script 能當 <a href="/blog/automation/knowledge-cards/beacon/" data-link-title="Beacon" data-link-desc="瀏覽器在頁面事件發生時主動送出、送出後不等回應的一則事件回報請求，用於靜態站把資料回傳給接收端">beacon</a> 接收端的前提。</p>
<h2 id="概念位置">概念位置</h2>
<p>部署有兩個決定端點行為的設定。<strong>執行身分（execute as）</strong> 決定程式用誰的權限跑：選「我」時，匿名訪客送來的請求也用你的身分執行，才能存取你的試算表。<strong>誰可存取（who has access）</strong> 決定誰能呼叫這個網址：接收匿名訪客的 <a href="/blog/automation/knowledge-cards/beacon/" data-link-title="Beacon" data-link-desc="瀏覽器在頁面事件發生時主動送出、送出後不等回應的一則事件回報請求，用於靜態站把資料回傳給接收端">beacon</a> 必須選「所有人」，因為訪客沒有登入 Google。</p>
<h2 id="可觀察訊號與例子">可觀察訊號與例子</h2>
<p>一個實務要點是部署與網址的關係：每次「新增部署作業」會產生一個新網址，但改完程式後應該用「管理部署作業」更新既有部署，網址才不變。用錯方式會讓前端指向舊網址、以為程式沒生效。</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><item><title>模組一：Apps Script 地基</title><link>https://tarrragon.github.io/blog/automation/01-apps-script-basics/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0800</pubDate><guid>https://tarrragon.github.io/blog/automation/01-apps-script-basics/</guid><description>&lt;p>回答「Apps Script 到底是什麼、它跟一台伺服器差在哪」。這一章打的是地基：&lt;code>doGet&lt;/code>/&lt;code>doPost&lt;/code> 進入點、部署成 web app 的模型、以及「執行身分」與「誰可存取」這兩個授權設定的含義。把地基搞懂，模組二做 beacon 時遇到的網址與權限狀況就不再是黑盒。&lt;/p>
&lt;p>Apps Script 是 Google 托管的 JavaScript 執行環境，跑在 V8 runtime 上，對個人帳號免費。它跟一般伺服器最大的差別是沒有一台常駐主機——程式只在被呼叫時執行、跑完就休眠，你不必管作業系統、不必管開機關機、不必付閒置費用。代價是它有執行時間與併發上限（見&lt;a href="https://tarrragon.github.io/blog/automation/00-mental-model/free-tier-and-tool-choice/" data-link-title="免費額度的思考方式與工具選型" data-link-desc="判斷免費膠水層撐不撐得住自己流量時該看哪個限制、以及 Apps Script 與 Cloudflare Workers 各自適合什麼場景">模組零：免費額度的思考方式&lt;/a>）。&lt;/p>
&lt;h2 id="章節文章">章節文章&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>文章&lt;/th>
 &lt;th>主題&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/automation/01-apps-script-basics/what-is-apps-script/" data-link-title="Apps Script 是什麼、跟一般伺服器差在哪" data-link-desc="把 Apps Script 定位成 Google 托管的無主機 JS 執行環境時，容器綁定與獨立專案的差別、以及沒有常駐程序帶來的取捨">Apps Script 是什麼、跟一般伺服器差在哪&lt;/a>&lt;/td>
 &lt;td>無主機執行模型、容器綁定 vs 獨立專案、沒有常駐程序的取捨、用到的服務&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://tarrragon.github.io/blog/automation/01-apps-script-basics/web-app-deployment-model/" data-link-title="web app 部署模型與授權" data-link-desc="把 Apps Script 掛成可被 HTTP 呼叫的端點時，doGet/doPost 進入點、exec 與 dev 兩種網址、以及更新部署為什麼要用同一個網址">web app 部署模型與授權&lt;/a>&lt;/td>
 &lt;td>&lt;code>doGet&lt;/code>/&lt;code>doPost&lt;/code>、&lt;code>exec&lt;/code> 與 &lt;code>dev&lt;/code> 兩種網址、更新部署不換網址、首次授權警告&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="跨分類引用">跨分類引用&lt;/h2>
&lt;ul>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/automation/00-mental-model/free-tier-and-tool-choice/" data-link-title="免費額度的思考方式與工具選型" data-link-desc="判斷免費膠水層撐不撐得住自己流量時該看哪個限制、以及 Apps Script 與 Cloudflare Workers 各自適合什麼場景">模組零：免費額度的思考方式與工具選型&lt;/a>：為什麼選 Apps Script&lt;/li>
&lt;li>→ &lt;a href="https://tarrragon.github.io/blog/automation/02-analytics-beacon/" data-link-title="模組二：流量 beacon 實作" data-link-desc="把「頁面被看了就送一則事件、接收端寫進 Sheet」從零做到收到第一筆真實瀏覽紀錄時的完整實作">模組二：流量 beacon 實作&lt;/a>：把地基用在實作上&lt;/li>
&lt;/ul></description><content:encoded><![CDATA[<p>回答「Apps Script 到底是什麼、它跟一台伺服器差在哪」。這一章打的是地基：<code>doGet</code>/<code>doPost</code> 進入點、部署成 web app 的模型、以及「執行身分」與「誰可存取」這兩個授權設定的含義。把地基搞懂，模組二做 beacon 時遇到的網址與權限狀況就不再是黑盒。</p>
<p>Apps Script 是 Google 托管的 JavaScript 執行環境，跑在 V8 runtime 上，對個人帳號免費。它跟一般伺服器最大的差別是沒有一台常駐主機——程式只在被呼叫時執行、跑完就休眠，你不必管作業系統、不必管開機關機、不必付閒置費用。代價是它有執行時間與併發上限（見<a href="/blog/automation/00-mental-model/free-tier-and-tool-choice/" data-link-title="免費額度的思考方式與工具選型" data-link-desc="判斷免費膠水層撐不撐得住自己流量時該看哪個限制、以及 Apps Script 與 Cloudflare Workers 各自適合什麼場景">模組零：免費額度的思考方式</a>）。</p>
<h2 id="章節文章">章節文章</h2>
<table>
  <thead>
      <tr>
          <th>文章</th>
          <th>主題</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/automation/01-apps-script-basics/what-is-apps-script/" data-link-title="Apps Script 是什麼、跟一般伺服器差在哪" data-link-desc="把 Apps Script 定位成 Google 托管的無主機 JS 執行環境時，容器綁定與獨立專案的差別、以及沒有常駐程序帶來的取捨">Apps Script 是什麼、跟一般伺服器差在哪</a></td>
          <td>無主機執行模型、容器綁定 vs 獨立專案、沒有常駐程序的取捨、用到的服務</td>
      </tr>
      <tr>
          <td><a href="/blog/automation/01-apps-script-basics/web-app-deployment-model/" data-link-title="web app 部署模型與授權" data-link-desc="把 Apps Script 掛成可被 HTTP 呼叫的端點時，doGet/doPost 進入點、exec 與 dev 兩種網址、以及更新部署為什麼要用同一個網址">web app 部署模型與授權</a></td>
          <td><code>doGet</code>/<code>doPost</code>、<code>exec</code> 與 <code>dev</code> 兩種網址、更新部署不換網址、首次授權警告</td>
      </tr>
  </tbody>
</table>
<h2 id="跨分類引用">跨分類引用</h2>
<ul>
<li>→ <a href="/blog/automation/00-mental-model/free-tier-and-tool-choice/" data-link-title="免費額度的思考方式與工具選型" data-link-desc="判斷免費膠水層撐不撐得住自己流量時該看哪個限制、以及 Apps Script 與 Cloudflare Workers 各自適合什麼場景">模組零：免費額度的思考方式與工具選型</a>：為什麼選 Apps Script</li>
<li>→ <a href="/blog/automation/02-analytics-beacon/" data-link-title="模組二：流量 beacon 實作" data-link-desc="把「頁面被看了就送一則事件、接收端寫進 Sheet」從零做到收到第一筆真實瀏覽紀錄時的完整實作">模組二：流量 beacon 實作</a>：把地基用在實作上</li>
</ul>
]]></content:encoded></item></channel></rss>