为特定项目谷歌工作表交叉更新同一工作表中两列的数据

时间:2021-07-20 15:52:26

标签: google-apps-script google-sheets

所以,我想在 C 列和 K 列之间“串扰”位于 D< /strong>(包含来自网络的各种链接 = D5)。

整个工作表分为两部分(见图):

  1. 主数据库 1. Worksheet Image
  2. 过滤的数据(在 D5:D 中过滤链接2.'Filter' formulas I've used - Take a look

如果我为C5中的项目选择“完成”(3.免疫学→1.转基因动物→2.生物技术和应用Zoology),我想在 K16 中选择 “完成”反之亦然。我希望所有项目都发生这种情况。 查看图片:3. C5→K16 & 4. K16→C5

此外,我将 Google Apps 脚本用于多行相关下拉列表 -

//Sheet = 'Link Database' - Creating suitable dependant Dropdown 
function onEdit(){
  //this line refers to the current active sheet
  var start = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  //this 'current' variable captures the currently selected cell in the active spreadsheet
  var current = start.getActiveCell();

  //var to refer to the worksheet
  var topicDatabase = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Topic Database");
  var linkDatabase = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Link Database");
  //has the user selected a subject?
  if (current.getColumn()==5)
  {
    //to copy the selcted subject
    var coiceSubject = current.getValue()
    topicDatabase.getRange("P2").setValue(coiceSubject)

    //clear any validation
    linkDatabase.getRange("F5:F").clearDataValidations();

    //create the rule
    var point = current.offset(0,1)
    var items = topicDatabase.getRange("N2:N")
    var rule = SpreadsheetApp.newDataValidation().requireValueInRange(items).build();
    
    //clear content
    point.clearContent();
    point.setDataValidation(rule)

  }
  //has the user selected a topic?
  if(current.getColumn()==6)
  {
    //to copy the selected topic
    var choiceTopic = current.getValue()
    topicDatabase.getRange("Q2").setValue(choiceTopic)
    

    //clear any validation
    linkDatabase.getRange("G5:G").clearDataValidations();


    //create the rule
    var point2 = current.offset(0,1)
    var items2 = topicDatabase.getRange("O2:O")
    var rule2 = SpreadsheetApp.newDataValidation().requireValueInRange(items2).build();

    point2.clearContent();
    point2.setDataValidation(rule2)
  }
  //if subject is blank - clear content & validation in topic and sub topic
  if(linkDatabase.getRange("E5:E").isBlank()==true){
    //clear validaton on the same range
    linkDatabase.getRange("F5:F").clearDataValidations();
    linkDatabase.getRange("G5:G").clearDataValidations();

    linkDatabase.getRange("F5:F").clearContent()
    linkDatabase.getRange("G5:G").clearContent()
 }
  else if(linkDatabase.getRange("F5:F").isBlank()==true){
    linkDatabase.getRange("G5:G").clearDataValidations();
    linkDatabase.getRange("G5:G").clearContent()
  }
}

谷歌表的链接 [更新已解决的答案]https://docs.google.com/spreadsheets/d/1-Oz4F02UnHrf9x_tBZLNU2BK5aMUHdfFgKnhjANMeTI/copy

1 个答案:

答案 0 :(得分:0)

你可以参考这个示例代码:

        @using Microsoft.AspNetCore.Identity
           @inject SignInManager<User> signInManager

           <ul class="navbar-nav">
           @if (signInManager.IsSignedIn(User))
           {
           <li class="nav-item">
           <a class="nav-link text-dark" asp-area="" asp-controller="Manage" asp-action="Index"     title="Manage">Hello @User.Identity.Name!</a>
           </li>
           <li class="nav-item">
            <form class="form-inline" asp-area="" asp-controller="Account" asp-action="Logout"      method="post">
                 <button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
                 </form>
           </li>

           }
          else
          {
             <li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp- action="Register">Register </a>
            </li>

           <li>
             <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Login">Log in</a>
            </li>
           }
           <li class="nav-item">
             <a class="nav-link text-dark" asp-area="" asp-controller="Admin" asp-action="List">Admin</a>
           </li> 
    </div>
    </div>
    </nav>

添加的修改:

  1. @model RegisterViewModel @{ ViewBag.Title = "Register"; } <h2>Register</h2> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <form method="post" asp-action="Register"> <div class="form-group row"> <div class="col-sm-2"><label>Username:</label></div> <div class="col-sm-4"> <input type="text" asp-for="Username" class="form-control" /> </div> <div class="col"> <span asp-validation-for="Username" class="text-danger"></span> </div> </div> <div class="form-group row"> <div class="col-sm-2"><label>Password:</label></div> <div class="col-sm-4"> <input type="password" asp-for="Password" class="form-control" /> </div> <div class="col"> <span asp-validation-for="Password" class="text-danger"></span> </div> </div> <div class="form-group row"> <div class="col-sm-2"><label>Confirm Password:</label></div> <div class="col-sm-4"> <input type="password" asp-for="ConfirmPassword" class="form-control" /> </div> </div> <div class="row"> <div class="offset-2 col-sm-4"> <button type="submit" class="btn btn-primary">Register</button> </div> </div> <div class="row"> <div class="offset-2 col-sm-4"> Already registered? <a asp-action="LogIn">Log In</a> </div> </div> </form> 中的过滤条件发生变化时,处理 @model LoginViewModel @{ ViewBag.Title = "Login"; } <h2>Login</h2> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <form method="post" asp-action="LogIn" asp-route-returnUrl="@Model.ReturnUrl"> <div class="form-group row"> <div class="col-sm-2"><label>Username:</label></div> <div class="col-sm-4"> <input type="text" asp-for="Username" class="form-control" /> </div> <div class="col"> <span asp-validation-for="Username" class="text-danger"></span> </div> </div> <div class="form-group row"> <div class="col-sm-2"><label>Password:</label></div> <div class="col-sm-4"> <input type="password" asp-for="Password" class="form-control" /> </div> <div class="col"> <span asp-validation-for="Password" class="text-danger"></span> </div> </div> <div class="form-group row"> <div class="offset-sm-2 col-sm-4"> <input type="checkbox" title="Remember Me" asp-for="RememberMe" class="form-check-inline" /> <label asp-for="RememberMe">Remember Me</label> </div> </div> <div class="row"> <div class="offset-2 col-sm-4"> <button type="submit" class="btn btn-primary">Log In</button> </div> </div> <div class="row"> <div class="offset-2 col-sm-4"> Not registered? <a asp-action="Register">Register as a new user</a> </div> </div> </form> 列中状态的更新。
  2. //Sheet = Link Database - Creating suitable dependant Dropdown function onEdit(e){ // YOUR ORIGINAL CODE HERE..... // if(start.getName() == "Link Database" ){ //Get list of filtered links in B5:B var filteredLinks = linkDatabase.getRange("B5:B").getDisplayValues().flat().filter(String); //Get all links in D5:D var allLinks = linkDatabase.getRange("D5:D").getDisplayValues().flat().filter(String); Logger.log(filteredLinks) Logger.log(allLinks) //Check if filter criteria was updated, update column C based on column K value if(current.getColumn()==2 && current.getRow() >= 2 && current.getRow() <= 4){ //Clear content of C5:C linkDatabase.getRange("C5:C").clearContent(); //Update status of each filtered links filteredLinks.forEach((link,index) => { var idx = allLinks.indexOf(link); if(idx > -1){ //Get status value in column K var status = linkDatabase.getRange(5+idx,11).getDisplayValue(); //Set status value in column C linkDatabase.getRange(5+index,3).setValue(status); } }); } //Get the rows being updated using the event object 'e' Logger.log(JSON.stringify(e)); var rowStart = e.range.rowStart; var rowCnt = e.range.rowEnd - rowStart; //Loop each row for(var i = 0; i <= rowCnt; i++){ var currentRow = rowStart + i; Logger.log(currentRow); //Check if status in column C5:C was updated. Update status in column K if(current.getColumn()==3 && currentRow >= 5){ var status = linkDatabase.getRange(currentRow,current.getColumn()).getDisplayValue(); Logger.log(status); //Get matching filtered link var index = currentRow - 5; //Get the filtered link index in allLink array var idx = allLinks.indexOf(filteredLinks[index]); Logger.log(idx); if(idx > -1){ //link found. Set status in column K linkDatabase.getRange(5+idx,11).setValue(status); }else{ //revert modification current.clearContent(); } } //Check if status in column K5:K was updated. Update status in column C if(current.getColumn()==11 && currentRow >= 5){ var status = linkDatabase.getRange(currentRow,current.getColumn()).getDisplayValue(); Logger.log(status); //Get matching link var idx = currentRow - 5; //Get the filtered link index in allLink array var index = filteredLinks.indexOf(allLinks[idx]); Logger.log(index); if(index > -1){ //link found. Set status in column K linkDatabase.getRange(5+index,3).setValue(status); } } } } } 列中的状态发生更改时,处理 C5:C 列中状态的更新。
  3. B2, B3, B4 列中的状态发生更改时,处理 K5:K 列中状态的更新。

注意:

为了获得被修改的行数,我使用了 onEdit event object C5:C。然后逐行循环每一行以更新列 C 或 K 的状态。

请注意,如果您使用编辑器手动运行脚本,您将遇到错误对象 C5:C 未定义。这是因为事件对象仅在您修改/编辑工作表中的单元格时才存在。要调试代码,我需要编辑工作表中的单元格/单元格范围,然后检查执行选项卡下的日志。