【教學】Google試算表 單層多層下拉選單(下)


本篇將教學如何建立多層選單。

開始囉!

還記得上篇的命名範圍嗎?(上篇的傳送門
要好好的命名喔~
在多層選單中,最重要的就是命名範圍!
命名範圍就有點像建立知識樹,透過定義名稱來延伸。

接下來,第一步,建立第一層選單。
選取「城市」這一整欄,選擇「資料」>「資料驗證」


在「條件」>「範圍內的清單」中輸入你定義的命名範圍,由於我將台北市、桃園市、新竹市...等等的,命名為「城市」,因此在藍色框框中我要輸入「城市」。

(換而言之,如果命名為「city」,你就要打「city」,命名「第一層」就要打「第一層」。)

瞬間,你就有選單可以選擇了(由於本人很懶惰,所以只用4個城市示意


接下來,我希望選擇「區鄉鎮」、「里」這一欄,能根據我選擇的城市做變化,就要帶入程式碼。
程式碼由製作這個影片的國際友人提供,讓我們謝謝他!

第二步,代入程式碼,
到「工具」點選「指令編碼器」,會另開視窗,複製程式碼過去


程式碼請注意這裡的數字


由於我的第一層選單「城市」在C也就是第3欄,所以在紅框地方要寫3,
第二層選單「區鄉鎮」在D也就是第4欄,所以在橘框地方要寫4。

程式碼:
function depDrop_(range, sourceRange){
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange, true).build();
range.setDataValidation(rule);
}
function onEdit (){
var aCell = SpreadsheetApp.getActiveSheet().getActiveCell();
var aColumn = aCell.getColumn();
if (aColumn == 3 && SpreadsheetApp.getActiveSheet()){
var range = SpreadsheetApp.getActiveSheet().getRange(aCell.getRow(), aColumn + 1);
var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(aCell.getValue());
depDrop_(range, sourceRange);
}
else if (aColumn == 4 && SpreadsheetApp.getActiveSheet()){
var range = SpreadsheetApp.getActiveSheet().getRange(aCell.getRow(), aColumn + 1);
var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(aCell.getValue());
depDrop_(range, sourceRange);
}

}

請完整複製以上指令,包括最後一個 }
而如果你有第三層、第四層選單,請在最後 三行的 } 中間插入這段程式碼(也就是第18行),


如下圖反紫色的地方所示:



追加的程式碼(依照需求增添,數字根據需求替換):
if (aColumn == 6 && SpreadsheetApp.getActiveSheet()){
var range = SpreadsheetApp.getActiveSheet().getRange(aCell.getRow(), aColumn + 1);
var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(aCell.getValue());
depDrop_(range, sourceRange);
}

比對一下最後的 } 不能忘喔!

然後按最上排的紅框標注的三角形執行,要授權直接給他!
最後按綠框圈住的磁碟片「儲存」
最後記得,在按紅框「執行」前,請先進行第一層的資料驗證喔
否則可能會出現紅字寫「引數不能為空值:range 」


關閉這個頁面,回到我們的試算表,
你會發現,當你選擇第一層選單後,第二層就會自動跑出來,然後第三層...例如:當我選擇「桃園市」,下一欄就會自動跳出選單,選擇「中壢市」之後,又會自動出現里的選單。



但注意一件事情喔!看看右邊的已命名範圍,如果你當初沒有好好命名範圍,在選擇的時候就會有點尷尬了....例如選擇新竹市的時候就不會跳出下個選單,或者你將台北市的範圍選錯成桃園的!
跑不出來QAQ
哎呀,台北怎麼有中壢?


難道就不能搶救一下嗎?可以的喔!只要到用來命名的工作表,新增選項,重新選擇範圍,還是可以很愉快的玩耍!
新增命名範圍以新竹市為例:

將F欄2列~F欄4列選取起來命名為「新竹市」

登登登登!回去表單選擇「新竹市」,行政區就自動出現啦!

所以這一層又一層的關係你搞懂了嗎?

廢虛覺得有了程式碼之後,最重要的就是「命名」啦!
命名決定了主次關係,要記得好好得梳理好喔!

一開始真的爬文爬得超辛苦的,一邊用一邊失敗,好險有神人大大寫出程式碼,所以只要專心地用好「命名」就可以啦!




留言

  1. 您好,我學習以上的做法在指令碼編輯器貼上後,按執行,上面顯示一條紅色的字寫
    引數不能為空值:range (第 2 行,檔案名稱:程式碼
    不曉得是不是哪裡出錯

    回覆刪除
    回覆
    1. 抱歉,晚回覆,你試試看先進行資料驗證,再跑程式碼,問題應該可以解決

      刪除
    2. 我也曾遇過上述的錯誤提示,或許能提供您一點協助!

      我犯的蠢錯誤是把第一層資料驗證的條件打成儲存格範圍(A2:A80),後來修改成"定義的命名範圍"的名稱(縣市),程式碼就能順利執行了 ~


      刪除
  2. 您好!這邊也有疑問……
    我能夠讓下層選單出現在下一欄而不是隔壁列嗎?
    例如第一層在C2,第二層在C3…這樣。

    回覆刪除
  3. 請問可編輯多個多層下拉式選單程式碼嗎?

    回覆刪除
  4. 您好我遇到一個問題是我按執行時,跳出視窗要我核對權限......
    最後告知我這個應用程式未經驗證......請問這是什麼原因呢@@?

    回覆刪除
    回覆
    1. 哈哈哈~我研究很久原來要進階才能授權>"<
      已經找到解決方法了~
      謝謝^_^~

      刪除
    2. 想請問 下所謂進階才能授權是指甚麼意思呢?我也遇到了同樣問題...

      刪除
  5. 作者已經移除這則留言。

    回覆刪除
  6. 弱弱的問一下,請問這樣的多層下拉選單程式有辦法同時使用在不同的頁籤嗎? 自己試了很久都找不到答案QQ
    比如頁籤一是設定在A欄~C欄程式碼是設定1~3,頁籤二需要設定在E欄~G欄程式碼卻不能同時設定5~7,如果把程式碼改掉就會有其中一個頁籤不能正常使用。

    是根據文中下述這段所提出的疑問:
    由於我的第一層選單「城市」在C也就是第3欄,所以在紅框地方要寫3,
    第二層選單「區鄉鎮」在D也就是第4欄,所以在橘框地方要寫4。

    回覆刪除
  7. 請問一下,我遇到的問題是,我無法開啟程式編輯器,有什麼方式可以打開?或是除了編輯器外還有其他方法做下拉式選單?

    回覆刪除
  8. 不好意思,我的excel點入程式碼編輯器,他顯示無法開啟,請問要怎麼做,他才能開啟?還是除了更改程式碼,還有其他方式可以做二層的下拉式選單

    回覆刪除
  9. 不好意思,我的excel點入程式碼編輯器,他顯示無法開啟,請問要怎麼做,他才能開啟?還是除了更改程式碼,還有其他方式可以做二層的下拉式選單

    回覆刪除
  10. 請問一下,我複製完程式碼,但是無法按最上排的紅框標注的三角形(顯示灰底),請問該怎麼辦?

    回覆刪除
  11. 不好意思,複製完程式碼,執行後他出現以下錯誤,想請問您要怎麼調整呢? 謝謝

    Exception: Argument cannot be null: range
    depDrop_ @ 程式碼.gs:2
    onEdit @ 程式碼.gs:16

    回覆刪除
  12. Harrah's Casino & Hotel - Mapyro
    777 김제 출장마사지 Harrah's Blvd, Joliet, IL 60401 US. Find reviews and discounts for AAA/AARP 여수 출장마사지 members, 경산 출장마사지 seniors, extended stays & military. Rating: 4.2 동해 출장안마 · ‎1,506 김제 출장안마 votes

    回覆刪除
  13. 請問在最後一層出來之後,可否做成從列表中移除?比如已經有一個dropdown list, 下一個drop down選取的值不可與之前選取的重複。
    像您這個例子:選了台北市,下行不能再選台北。謝謝!

    回覆刪除

張貼留言

這個網誌中的熱門文章

【教學】Google試算表 單層多層下拉選單(上)

《角力教學》吳怡農x曾博恩 BL 二創