簡體   English   中英

帶有下拉菜單和將行插入命名范圍的 Google 表格對話框

[英]Google Sheets Dialog with Dropdown and Insert Row into Named Range

我有一張表格,我的公司用它來跟蹤公司內部的空缺班次。 我希望腳本將行添加到正確工作表上的正確命名范圍中。 用戶將從下拉列表中選擇一個帳戶並輸入多個未結班次。 未清班次的數量將通過命名范圍作為行添加到帳戶中。 “本周”的代碼將通過命名范圍將行插入到兩個單獨的工作表中。 (本周,本周_writeonce)

這是我到目前為止的代碼,

function onOpen() {
 SpreadsheetApp
   .getUi()
   .createMenu("Add Holes")
   .addItem("Add Holes for This Week", "showThisWeekSidebar")
   .addItem("Add Holes for Next Week", "showNextWeekSidebar")
   .addToUi();
}

function showThisWeekSidebar() {
  var html = HtmlService
      .createTemplateFromFile('This Week');

  // Add the dropdown lists to the template
  html.namedRangesDPDWN = SpreadsheetApp.getActiveSheet().getRange("Named Ranges!NamedRanges").getValues();

  // Keep adding the variables you need based on the ranges containing your dropdown values
  // ...

  // Prepares the template to be shown in the UI
  html = html.evaluate()
      .setTitle('Company Name')
      .setWidth(200);

  SpreadsheetApp.getUi().showSidebar(html);
}

function showNextWeekSidebar() {
  var html = HtmlService
      .createTemplateFromFile('Next Week');

  // Add the dropdown lists to the template
  html.namedRangesDPDWN = SpreadsheetApp.getActiveSheet().getRange("Named Ranges!NamedRanges").getValues();

  // Keep adding the variables you need based on the ranges containing your dropdown values
  // ...

  // Prepares the template to be shown in the UI
  html = html.evaluate()
      .setTitle('Company Name')
      .setWidth(200);

  SpreadsheetApp.getUi().showSidebar(html);
}

下面是 HTML 代碼。

<center>
<body bgcolor="#99a3a4">
  <font face="arial" color="black">
    <b>Add Holes for This Week</b><br><br>

    <!-- Create input fields to accept values from the user -->
    Account:<br>
    <select id="Named Ranges">
    <? for (let i in namedRangesDPDWN) { ?>
      <option value="<?=namedRangesDPDWN[i]?>"><?=namedRangesDPDWN[i]?></option>
    <? } ?>
    </select>
    <br><br>

 <div class="block form-group">
    <label for="numberOfHoles"># of Open Shifts</label><br>
    <input type='text' name='email' id="email" required="required"/>
    </div><br>

  <div>
    <button type="submit"id="submit-form">Submit</button>
  </div>

嘗試獲取代碼以計算命名范圍內的行數,如果大於 2,則不考慮現有行。

// Take the Account and number of holes from
// the sidebar and insert rows to the proper named range
function insertRowNext(account,n_rows) {  
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var ws = ss.getSheetByName('Next Week');  // Change to your sheet name
    
    //Replace space with underscore
    account=account.replace(/ /g,"_");
    var nameRange = 'Next Week!'+account;
    var range = ss.getRangeByName(nameRange);
    var rangeRows = range.getNumRows();
    n_rows-=1;
    
    if(rangeRows == 2){
      //add row      
      ws.insertRowsBefore(range.getLastRow(),n_rows);
      //Show all rows in the namedRange
      ws.showRows(range.getRow(),range.getNumRows()+n_rows);
      
    }
    else if (rangeRows > 2) {
      //add row      
      ws.insertRowsBefore(range.getLastRow(),n_rows+1);
      //Show all rows in the namedRange
      ws.showRows(range.getRow(),range.getNumRows()+n_rows+1);
    }
 }

這是樣本表。 https://docs.google.com/spreadsheets/d/1zxdqkksdORfAUlmhnQmefKpxn8n-hB-3YeHdRiNLCLs/edit?usp=sharing

這是一個示例代碼:(僅適用於本周添加孔菜單)

本周.html:

<center>
<body bgcolor="#99a3a4">
  <font face="arial" color="black">
    <b>Add Holes for This Week</b><br><br>

    <!-- Create input fields to accept values from the user -->
    Account:<br>
    <select id="Named Ranges">
    <? for (let i in namedRangesDPDWN) { ?>
      <option value="<?=namedRangesDPDWN[i]?>"><?=namedRangesDPDWN[i]?></option>
    <? } ?>
    </select>
    <br><br>

 <div class="block form-group">
    <label for="numberOfHoles"># of Open Shifts</label><br>
    <input type='text' name='email' id="email" required="required"/>
    </div><br>

  <div>
    <button type="submit"id="submit-form" onclick="processInput()">Submit</button>
  </div>
  <script>
    function processInput(){
      var account = document.getElementById("Named Ranges").value;
      var count = document.getElementById("email").value;

      google.script.run.withSuccessHandler(success).insertRowThis(account,count);
    }

    function success(){
      alert("Row added successfully");
    }
  </script>

修改:

  • 我添加了一個腳本來在點擊提交按鈕時調用processInput()
  • processInput() ,它將獲得選擇的帳戶和未結班次的數量。 然后將它們作為參數傳遞並在服務器端調用insertRowThis()

我們使用google.script.run.withSuccessHandler(function)來調用服務器端 Apps Script 函數,當服務器響應時,該函數會調用客戶端回調函數運行。 在這個例子中,客戶端回調是success()

addHolesMenu.gs

 function insertRowThis(account,n_rows) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var ws = ss.getSheetByName('This Week');
    
    //Replace space with underscore
    account=account.replace(/ /g,"_");
    var nameRange = 'This Week!'+account;
    n_rows-=1;
    Logger.log(nameRange);
    Logger.log(n_rows);
    if(n_rows>0){
      //add row
      var range = ss.getRangeByName(nameRange);
      Logger.log(range.getRow());
      Logger.log(range.getLastRow());
      ws.insertRowsBefore(range.getLastRow(),n_rows);
      //Show all rows in the namedRange
      ws.showRows(range.getRow(),range.getNumRows()+n_rows);
    }
 }

修改:

  • 我添加了接受 2 個參數的insertRowThis()
  • 由於此菜單用於在工作表This Week添加行。 我使用Spreadsheet.getSheetByName(name)選擇了該特定工作表。
  • 用帳戶名稱中的underscore替換space
  • 從行輸入計數中減去 1
  • 創建一個 nameRange 字符串以獲取 Sheet This Week的特定范圍。 然后使用Spreadsheet.getRangeByName(name)
  • 在namedRange 的末尾之前插入所需的行數。 這背后的原因是,如果我們在namedRange 的最后一行之后插入該行,它不會包含在namedRange 本身中。 要在添加其他行時自動調整 namedRange,應將其添加在 namedRange 的最后一行之前。
  • 顯示namedRange下的所有行,包括新添加的行

輸出:

在此處輸入圖片說明

在此處輸入圖片說明

在此處輸入圖片說明

(更新)

在 E 列中添加公式:

// ==========================================================================================================
// Take the Account and number of holes from
// the sidebar and insert rows to the proper named range
function insertRowThis(account,n_rows) {  
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var ws = ss.getSheetByName('This Week');  // Change to your sheet name
    
    //Replace space with underscore
    account=account.replace(/ /g,"_");
    var nameRange = 'This Week!'+account;
    var range = ss.getRangeByName(nameRange);
    var rangeRows = range.getNumRows();
    n_rows-=1;
    Logger.log(range.getA1Notation());
    Logger.log(rangeRows);
    Logger.log(range.getRow());
    Logger.log(range.getLastRow());
    if(rangeRows == 2){
      //add row      
      ws.insertRowsBefore(range.getLastRow(),n_rows);
      //Show all rows in the namedRange
      ws.showRows(range.getRow(),range.getNumRows()+n_rows);
      
    }
    else if (rangeRows > 2) {
      //revert subtracted row count
      n_rows+=1;
      //add row      
      ws.insertRowsBefore(range.getLastRow(),n_rows);
      //Show all rows in the namedRange
      ws.showRows(range.getRow(),range.getNumRows()+n_rows);
    }

    //Get formula in the header row in column E
    var formula = ws.getRange(range.getRow(),5).getFormula();
    Logger.log(formula);
    //Add formula in the newly added rows
    for (var i = 0; i<n_rows; i++){
      Logger.log("row: "+(range.getLastRow()+i));
      ws.getRange(range.getLastRow()+i,5).setFormula(formula);
    }
 }

您可以參考此示例代碼來調整您的其他菜單。 您可以刪除不必要的日志,我只是將它們用於調試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM