简体   繁体   English

Google Sheets + Apps Script + Webapps:更新与 ID 匹配的现有行

[英]Google Sheets + Apps Script + Webapps: update existing row that matches the ID

Hi I got this script and webapp that pull the row that matches the id number from my webapp now what I'm trying to do is update the row that matches the ID in my google sheet column 'A' I don't want to create a new row I just want it to replace / update the existing row that matches the ID number from my webapp once I've made change and click on the update button嗨,我得到了这个脚本和 webapp,它从我的 webapp 中提取与 id 号匹配的行,现在我要做的是更新与我的 google sheet 列“A”中的 ID 匹配的行,我不想创建一个新行,一旦我进行更改并单击更新按钮,我只想让它替换/更新与我的 webapp 中的 ID 号匹配的现有行

link to the google sheet page https://docs.google.com/spreadsheets/d/1eaEfRtjMz7kyQfyXZHLuBhSz91SiUJzq1J2QJexJxy4/edit?ts=5fc42833#gid=0链接到谷歌表格页面https://docs.google.com/spreadsheets/d/1eaEfRtjMz7kyQfyXZHLuBhSz91SiUJzq1J2QJexJxy4/edit?ts=5fc42833#gid=0

Thanks谢谢

gs code GS代码

    function doGet(request) {
  return HtmlService.createTemplateFromFile('Index').evaluate();
 
}

/* @Include JavaScript and CSS Files */
function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}
/* @Process Form */




function editCustomerById(Id,custDetail){
 
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const ws = ss.getSheetByName("Data");
  const custIds = ws.getRange(2, 1, ws.getLastRow()-1, 1).getValues().map(r => r[0].toString().toLowerCase());
  const posIndex = custIds.indexOf(Id.toString().toLowerCase());
  const rowNumber = posIndex === -1 ? 0 : posIndex + 2;
  
  
  ws.getRange(rowNumber, 2,1,8).setValues([[              
  
                custDetail.Date,
                custDetail.client,
                custDetail.location,
                custDetail.other1, 
                custDetail.other2,
                                  
                                         
                                         
                                         
                                         ]]);
  return true;
}


function getCustDetail(search) {
  search = Number(search);
  var ss = SpreadsheetApp.getActive();
  var ws = ss.getSheetByName("Data");
  var idvCustData = ws.getRange(2,1,ws.getLastRow(),8).getValues();
  var custIdList = idvCustData.map(function(r){ return r[0]; });
  var custDateList = idvCustData.map(function(r){ return r[2]; });
  var custclientList = idvCustData.map(function(r){ return r[3]; });
  var custlocationList = idvCustData.map(function(r){ return r[4]; });
  var custother1List = idvCustData.map(function(r){ return r[5]; });
  var custother2List = idvCustData.map(function(r){ return r[6]; });
  var searchPostion = custIdList.indexOf(search);
  var custDetail = {};
  custDetail.Id = custIdList[searchPostion];
  custDetail.Date = custDateList[searchPostion] && Utilities.formatDate(custDateList[searchPostion], Session.getScriptTimeZone(), "yyyy-MM-dd");
  custDetail.client = custclientList[searchPostion];
  custDetail.location = custlocationList[searchPostion];
  custDetail.other1 = custother1List[searchPostion];
  custDetail.other2 = custother2List[searchPostion];
  if (searchPostion > -1){
    return  custDetail;
  } else {
    return null;
  }
}

JS code JS代码

<script>
  // Prevent forms from submitting.
  function preventFormSubmit() {
    var forms = document.querySelectorAll('form');
    for (var i = 0; i < forms.length; i++) {
      forms[i].addEventListener('submit', function(event) {
      event.preventDefault();
      
     
      
      });
    }
  
  document.getElementById("Id").addEventListener("change",getCustomer);
  
  
  }
  window.addEventListener('load', preventFormSubmit);  
  
  function handleFormSubmit(formObject) {
    google.script.run.processForm(formObject);
    document.getElementById("myForm").reset();
    
  






}           
               
               

//Retrieve Customer
function getCustomer() {
  
  var searchId = document.getElementById("Id").value;
  
 if (searchId!= ""){
    google.script.run.withSuccessHandler(custDetail).getCustDetail(searchId);
  } 
  
}

//Success Handler
function custDetail(cust){
  if (cust) {
    document.getElementById("Id").value = cust.Id;
    document.getElementById("Date").value = cust.Date;
    document.getElementById("client").value = cust.client;
    document.getElementById("location").value = cust.location;
    document.getElementById("other1").value = cust.other1;
    document.getElementById("other2").value = cust.other2;
    M.updateTextFields();
  }
}





 function editCustomer(){
          
          var custDetail = {};
          
   
         
         custDetail.Date = document.getElementById("Date").value
         custDetail.client = document.getElementById("client").value
         custDetail.location = document.getElementById("location").value
         custDetail.other1 = document.getElementById("other1").value
         custDetail.other2 = document.getElementById("other2").value
         
         
          
          
          var id = document.getElementById("Id").value;
          
          google.script.run.withSuccessHandler().editCustomerById(id,custDetail);
      
      }
      
</script>

html code html代码

<!DOCTYPE html>
<html>
    <head>
        <base target="_top">
        <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
        <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js" integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o" crossorigin="anonymous"></script>
        
    
    <?!= include('JavaScript'); ?>
    <?!= include('CSS'); ?>
    
    <!-- Select2 CDN -->
        <link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/css/select2.min.css" rel="stylesheet" />
        <script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-beta.1/dist/js/select2.min.js"></script>
        
        
     <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
     <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
     <script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>   
   
   
   
   
     <!-- CSS only -->
    <link rel="stylesheet" href= "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"
        integrity= "sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z"
        crossorigin="anonymous"> 
  
    <!-- JS, Popper.js, jquery and jQuery autocomplete -->
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
        integrity= "sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" 
        crossorigin="anonymous"> 
    </script> 
    <script src= "https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"
        integrity= "sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN"
        crossorigin="anonymous"> 
    </script> 
    <script src= "https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"
        integrity= "sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV"
        crossorigin="anonymous"> 
    </script>   

    </head>
   
      <body>
        <div class="container">
            <div class="row">
                <div class="col-12">
                    <form id="myForm" onsubmit="handleFormSubmit(this)">
                      <p class="h4 mb-4 text-center">Ticket Form</p>
                      
                      
           <div class="form-row">
           
           
           
           

              
               <div class="form-group col-md-2">
               <label for="Id">ID</label>
               <input type="text" class="form-control" id="Id" name ="Id">
              </div>
              
             
              
              <div class="form-group col-md-2">
               <label for="Date">Ticket Date</label>
               <input type="date" class="form-control" id="Date" name ="Date">
              </div>
              
               <div class="form-group col-md-4">
                 <label for="client">Client</label>
                 <input type="text" class="form-control" id="client" name="client" >
               </div>
                           
               <div class="form-group col-md-4">
                 <label for="location">Location</label>
                 <input type="text" class="form-control" id="location" name="location" >
               </div>
             </div>
   
          <div class="form-row">
             
             <div class="form-group col-md-2">
               <label for="other1">Other1</label>
               <input type="text" class="form-control" id="other1" name ="other1">
              </div>
              
              <div class="form-group col-md-4">
                 <label for="other2">Other2</label>
                 <input type="text" class="form-control" id="other2" name="other2" >
               </div>
                
            </div>
               <hr>
                 <br>
                         
                   <button type="submit" class="btn btn-primary btn-block col-md-4 ">Update</button>
                        
             </form>

                     <br>
                    <div id="output"></div>
                  </div>
                 </div>      
                </div>
               </body>
            </html>

I believe your goal as follows.我相信你的目标如下。

  • When "Update" button is clicked, you want to check the ID from the Spreadsheet.单击“更新”按钮时,您想从电子表格中检查 ID。
  • When the ID is existing in the column "A" of Spreadsheet, you want to update the same row.当 ID 存在于电子表格的“A”列中时,您希望更新同一行。
  • When the ID is not existing in the column "A" of Spreadsheet, you are not required to process.当电子表格的“A”列中不存在 ID 时,您无需处理。

Modification points:修改点:

  • I think that in your case, the script of processForm is required to be modified.我认为在您的情况下,需要修改processForm的脚本。 But from your replying, I understood that you have no script of processForm .但是从您的回复中,我了解到您没有processForm的脚本。
  • When google.script.run.processForm(formObject) in your Javascript is run, at Google Apps Script side, formObject is parsed like {"Id":"##","other2":"##","location":"##","client":"##","Date":"##","other1":"##"} .google.script.run.processForm(formObject)运行时,在 Google Apps 脚本端, formObject被解析为{"Id":"##","other2":"##","location":"##","client":"##","Date":"##","other1":"##"} I think that using this value, the ID of column "A" can be searched using TextFinder.我认为使用此值,可以使用 TextFinder 搜索列“A”的 ID。

Modified script:修改后的脚本:

Please add the following script of processForm to the Google Apps Script side.请将processForm的以下脚本添加到 Google Apps 脚本端。

function processForm(formObject) {
  var sheet = SpreadsheetApp.getActive().getSheetByName("Data");
  var range =  sheet.getRange("A1:A" + sheet.getLastRow()).createTextFinder(formObject.Id).findNext();
  if (range) {
    var values = [[new Date(),formObject.Date,formObject.client,formObject.location,formObject.other1,formObject.other2]];
    range.offset(0, 1, 1, values[0].length).setValues(values);
  }
}
  • In this sample script, it supposes that the same IDs are not included in the column "A".在此示例脚本中,它假设相同的 ID 不包含在“A”列中。 Please be careful this.请注意这一点。

Note:笔记:

  • When you modified the script of Web Apps, please redeploy the Web Apps as new version.当您修改 Web Apps 的脚本时,请将 Web Apps 重新部署为新版本。 By this, the latest script is reflected to the Web Apps.这样,最新的脚本就会反映到 Web 应用程序中。 Please be careful this.请注意这一点。

Reference:参考:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM