星期三, 7月 30, 2025

[GAS] 部屬網頁程式

寫一隻 .gs 程式,該程式內容為 insert 一筆資料進入 Google SpreadSheets,把 .gs 程式進行部屬後,並透過 Edge、Postman 進行測試 ,藉此理解 Google Apps Script 部屬功能

程式碼 (.gs) 符合下列規定,即可發布為網頁應用程式: 
  • 包含 doGet(e) 或 doPost(e) 函式。 
  • 這個函式會傳回 HTML 服務 HtmlOutput 物件或內容服務 TextOutput 物件。
當向網路應用程式傳送
  • HTTP GET Request 時,執行 doGet(e) 
  • HTTP POST Request 時,執行 doPost(e)
而 e 引數內容可以參考官方文章-request parameter,該範例會用上 e.parameter

.gs Code
function doGet(e) {
  return Insert(e);
}

function doPost(e) {
  return Insert(e);
}

function Insert(e) {

  let spreadSheet = SpreadsheetApp.getActiveSpreadsheet(); 
  let sheet = spreadSheet.getSheetByName("工作表1");
  let now = Date();
  // 使用 e.parameter 來抓傳遞進來的參數
  let data = [now , e.parameter.UserName, e.parameter.Desc];
  sheet.appendRow(data);

}
部屬為網頁程式

右上角有藍色 [部屬] 按鈕

點擊 [部屬] 按鈕 => 新增部屬作業

新增部屬作業 => 選擇 [網頁應用程式],之後再進行部屬就不用選擇
填寫部屬內容資訊
  • 說明:預設為 [未命名],通常會自行輸入有意義的名稱
  • 執行身分:[我 (OOXX@gmail.com)] 或 [存取網頁應用程式的使用者]
  • 誰可以存取:[只有我自己]、[所有已登入 Google 帳戶使用者]、[所有人]

完成部署作業後,可以複製該網頁應用程式網址來使用
Edge、Postman 進行測試

網頁應用程式網址 (exec 結尾)加上問號 (?),再加上參數 UserName=使用者姓名&Desc=文字描述
https://script.google.com/macros/s/AKfycbzHzWP/exec?UserName=使用者姓名&Desc=文字描述

Edge 模擬 http get request、Postman 模擬 http post request,下方只記錄 Postman     

從 Goolge SpreadSheets 內資料比對 GAS 執行項目來觀察,確定 Edge 因為發出 http get request 跑 doGet(e),Postman 發出 http post request 跑 doPost(e)

星期二, 7月 29, 2025

[JS] 迴圈-變數洩漏

學習 javascript 迴圈使用時,注意到變數洩漏的重點

使用 var 宣告變數
function myFunction() {

  var fruits = ["apple", "banana", "cherry", "grape"];
  // 使用 var 宣告迴圈內的 i 變數
  for (var i = 0; i < fruits.length; i++) {
    Logger.log("輸出:" + fruits[i]);
  }

  Logger.log(i); // 可以存取 for 迴圈內的 i 變數
}
執行結果
使用 let 宣告變數
function myFunction() {

  var fruits = ["apple", "banana", "cherry", "grape"];
  // 使用 let 宣告迴圈內的 i 變數
  for (let i = 0; i < fruits.length; i++) {
    Logger.log("輸出:" + fruits[i]);
  }

  Logger.log(i); // 無法存取 for 迴圈內的 i 變數,執行時直接報錯
}

執行結果

星期一, 7月 28, 2025

[GAS] 自行定義回覆 Email

該篇筆記要透過 gas 來自行定義回覆 Email (Thank You Email),模擬活動報名後,會發送活動內容 Email 給報名者,內容包含 Google Map 連結和 PDF 附加檔案
 
Javascript 語法 (.gs)
function SendThankYouEmail() {

  /* 取的 Spreadsheets 內的 email */
  var spreadSheetID = '自行取得 SpreadSheetID';
  var spreadSheet = SpreadsheetApp.openById(spreadSheetID);
  var sheet = spreadSheet.getSheets()[0];
  var lastRow = sheet.getLastRow();
  var recipient = sheet.getRange(lastRow, SpreadSheet 上的 Email 欄位).getValue();
  
  /* 取的 Google Drive 檔案 */
  var fileID = "自行取得 Google Drive 上檔案 ID";
  var file = DriveApp.getFileById(fileID);
  var attachment = file.getAs(MimeType.PDF);
  
  /* 取的 Google Map 連結 */
  var address = "玉山登山口";
  var googleMapLink = "https://maps.google.com/?q=" + encodeURIComponent(address);

  /* 使用 GMail 把活動相關資訊寄出 */
  var subject = "透過 gas 自行定義 Thank You Email";
  var mailbody = '感謝您的報名 <br/>' + 
                  '上課地點:' + address + '( <a href="' + googleMapLink + '">點我在 Google Map 進行導航</a> ) <br/>' + 
                  '附件為活動通知 PDF,請詳閱';

  GmailApp.sendEmail(
    recipient, 
    subject, 
    '', 
    {
      attachments: attachment,
      name: "活動小編", // 自訂寄件者名稱
      htmlBody: mailbody
  });
}

設定觸發條件
  • 選擇您要執行的功能:SendThankYouEmail 函式
  • 選擇活動類型:提交表單時   

填寫 Forms 後收到的 Email 通知


星期日, 7月 27, 2025

[Forms] 回覆-傳送表單回覆副本給作答者

Google Forms 送出表單後,可以透過 [回覆 - 傳送表單回覆副本給作答者],把作答者填寫資料,截圖送一份至作答者 Email 信箱

開啟該 Forms => 設定 => 回覆,回覆內需要設定兩個選項
  • 收集電子郵件地址:不收集 (Do not collect)、已驗證 (Verified)、由作答者手動輸入 (Responder Input)
  • 傳送表單回覆副本給作答者:關閉 (off)、要求即傳送 (When requested)、一律 (Always)
開啟 [傳送表單回覆副本給作答者] 選項的話,[收集電子郵件地址] 一定要是
  • 已驗證:作答者必須登錄 Google
  • 由作答者手動輸入:作答者會手動輸入自己的電子郵件地址

設定完成 Forms 上就會出現 [電子郵件] 問題,[填寫人 Email] 是我之前就手動建立問題


Forms 下方會出現 [系統會透過電子郵件將你的作答內容複本傳送到你所提供的地址]

實際作答後送出,就會收到作答問題截圖

星期六, 7月 26, 2025

[Forms] 外掛-Form Notifications

使用 Google 官方推出外掛程式 (Add-On) - Form Notifications,來達到 Email 通知設定

點擊「 ⋮ 」更多 (More)  => 取得外掛程式
Google Workspace Marketplace 內搜尋 Form Notifications 就可以找到,安裝時會有授權機制必須允許才能進行安裝
點選外掛程式圖示,就可以開啟 Form Notifications,點選 Open 選項
在瀏覽器右下角會出現 Form Notifications 設定,可以分為
  • Notify on form responses:通知 Form 擁有者或是相關人員
  • Thank you email: 回覆給填表人員的相關資訊
Notify on form responses
  • Enter recipient emails:擁有者會是預設收件人,也可以自行新增多位收件人 Email,Email 用逗號 (,) 分隔開就好
  • Send notifications after every N responses:有 N 位填表人才發信通知
Thank you email
  • Collect email:選擇 By form field
  • Email field:Form 表單內的 Email 欄位,該例子是 [填寫人 Email]
  • send a copy to:擁有者會是預設收件人,也可以自行新增多位收 Email,Email 用逗號 (,) 分隔開就好
  • Notification email subject:email 抬頭
  • Notification email body:email 內文

填表人收到的 Email 通知
Form 擁有者收到的 Email 通知

星期五, 7月 25, 2025

[SQL] 標準報表-耗用記憶體

instance 層級的標準報表,開啟路徑如下圖
通常會觀察兩個重點,分別為
  • Memory Grants Pending:此數值呈現 SQL Server 需要記憶體時等待狀況,記憶體充足時此數值恆為 0,大於 0 則判斷記憶體不足,非常直觀。
  • Page life expectancy:越大越好,代表記憶體夠,不須把暫存資料清掉,一般平均值要大於 300 秒,代表快取的資料頁在記憶體中保有 5 分鐘以上。 

星期二, 7月 22, 2025

[SSRS] 修正 namespace 名稱,造成無法開啟資料集功能

延續該筆記 - [SSRS] DataSource 重覆,造成無法開啟資料集功能 相同錯誤訊息,但這次肇事者不是我啦,同事修正部門名稱 namespcace 名稱大小寫,不知道為什麼竟然打成全大寫,不符合公司內命名規則,EX:AAAA,正確為 Aaaa,修正後沒有注意到報表 rdlc 和報表 DataSource 並不會隨著 IDE F2 快捷修正功能一併修改,導致該異常發生

錯誤訊息
直接用記事本開啟 rdlc 並搜尋關鍵字 DataSetInfo 來找到 DataSource 並修正
<rd:DataSetInfo>
  <rd:DataSetName>公司英文名稱.Service.ReportModel.部門英文名稱</rd:DataSetName>
  <rd:TableName>ooxxReportModel</rd:TableName>
  <rd:ObjectDataSourceType>公司英文名稱.Service.ReportModel.部門英文名稱.ooxxReportModel, 公司英文名稱.Service, Version=2020.9.22.1650, Culture=neutral, PublicKeyToken=null</rd:ObjectDataSourceType>
</rd:DataSetInfo>
滑鼠點擊開啟 DataSource 就可以看見 GenericObjectDataSource 內的 TypeInfo
<?xml version="1.0" encoding="utf-8"?>
<!--
    This file is automatically generated by Visual Studio .Net. It is 
    used to store generic object data source configuration information.  
    Renaming the file extension or editing the content of this file may   
    cause the file to be unrecognizable by the program.
-->
<GenericObjectDataSource DisplayName="ooxxReportModel" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
   <TypeInfo>公司英文名稱.Service.ReportModel.部門英文名稱.ooxxReportModel, 公司英文名稱.Service, Version=2020.9.22.1650, Culture=neutral, PublicKeyToken=null</TypeInfo>
</GenericObjectDataSource>
修正以上兩點就恢復正常

星期一, 7月 21, 2025

[Forms] 通知設定

[Google Forms] 有新回應時透過電子郵件通知我 內是透過 Google Forms 設定來達到主動發信通知,該篇則是透過連結的 Spreadsheet 通知設定來做到主動通知

Google Forms 回覆 => 點擊「 ⋮ 」更多 (More)  => [選取回應目標位置]

建立新試算表,預設名稱為 [Google Forms 名稱] + (回覆) 文字

Spreedsheet => 工具 => 通知設定 => 編輯通知


設定通知規則
  • 發生以下情況時透過 Email 通知我:有人提交表單時
  • 通知方式:電子郵件 - 立即
以上兩個設定值為必選項目
設定通知規則清單,可以設定多個通知規則
使用者實際填寫表單送出後,就會收到從 comments-noreply@docs.google.com 發出的 Email 通知
Email 內容連結分為兩大類

星期日, 7月 20, 2025

[Forms] 有新回應時透過電子郵件通知我

Google Forms 當有人填寫表單並送出時,可以主動發 Email 通知,管理者就不用特別去查看是否有人填寫表單資料,步驟如下

開啟已設計好的 Google Forms,該範例只設計一欄填寫 Email 欄位
點選 [回覆] Tag 並點選「 ⋮ 」更多 (More) 

勾選 [有新回應時透過電子郵件通知我]

使用者實際填寫表單送出後,就會收到從 forms-receipts-noreply@google.com 發出的 Email 通知,該 mail 內容主要是通知作用,mail 內文沒有任何使用者填寫相關資料
點選 mail 內文的 [查看回應] 或 [查看摘要],會連回 Google Forms 回覆 Tag 內,
  • 查看回應 => 回覆內 [個別] Tag
  • 查看摘要 => 回覆內 [摘要] Tag

星期日, 7月 06, 2025

[GAS] 建立 Google Doc 並寄送文件連結至使用者信箱

根據官方文章- 自動化快速入門導覽課程 來練習,該文章基本上就是 Hello World 意思
function CreateAndSendDocument() {
  try 
  {
    // 建立檔名為 Hello World 的 Goolge Doc
    const doc = DocumentApp.create('Hello World');

    // 存取 Google Doc 並新增內容
    doc.getBody().appendParagraph('該文件是使用 Google Apps Script 建立');

    // 取得 Google Doc 文件 URL
    const url = doc.getUrl();

    // 取得 Google Doc 檔案名稱,要把檔案名稱當成 Email 主旨
    const subject = doc.getName();

    // 取得自己的 Email
    const email = Session.getActiveUser().getEmail();

    // 把 Google Doc 檔案連結放在 Email 內文
    const body = 'Google Doc 連結: ' + url;
    
    // 對自己寄送 Email
    GmailApp.sendEmail(email, subject, body);
  } 
  catch (err) 
  {
    // 處理 Exception
    console.log('Failed with error %s', err.message);
  }
}

執行時會出現需要該 Project 授權
執行後結果