【问题标题】:Google Apps Script for INDEX/MATCH用于 INDEX/MATCH 的 Google Apps 脚本
【发布时间】:2020-05-12 20:21:46
【问题描述】:

我有 2 张工作表,它们都有相同 ID 的行。

两张表都有一个 ID 列,内部审计登记册中的 B 栏和 SOP 登记册中的 A 栏。当日期输入到内部审计登记册的 G 列时,我希望将该日期粘贴/覆盖到 ID 匹配的 SOP 登记册的 H 列。在同一行中,我还希望将 E 列更改为 false,并清除 F 和 G 列。

我已经部分编写了以下 onEdit(e) 脚本,但我正在努力使用 VLOOKUP 或 INDEX/MATCH 脚本。

// Edit SOP Register sheet after Internal Audit completed
 {var spreadsheet = e.source;
  var originsheetname = "Internal Audit Register"
  var range = e.range;
  var sheet = range.getSheet();
  var row = range.getRow();
  var column = range.getColumn();
  var editedColumn = range.getColumn();
  var editedRow = range.getRow();
  var column = 7;
  var date = range.getValue();
  if(Object.prototype.toString.call(date) === '[object Date]' && editedColumn == column && editedRow > 2 && sheet.getName() == originsheetname) {
    var objectsheetname = "SOP Register";
    var object = e.source.getSheetByName(objectsheetname);
    object.showColumns(5,2);
    object.getColumn(6,1),copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
    }}}}}}//End of onEdit Functions

Sample Spreadsheet

非常感谢您的帮助。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    此功能需要可安装的触发器。

    function onMyEdit(e) {
      //e.source.toast('Entry');
      const sh=e.range.getSheet();
      if(sh.getName()=="Internal Audit Register" && e.range.columnStart==7 && isDate(new Date(e.value))) {
        //e.source.toast('Flag1');
        const id=e.range.offset(0,-5).getDisplayValue();
        const osh=e.source.getSheetByName("SOP Register");
        const oshsr=3;
        const org=osh.getRange(oshsr,1,osh.getLastRow()-oshsr+1,osh.getLastColumn());
        const ovs=org.getDisplayValues();
        for(var i=0;i<ovs.length;i++) {
          if(ovs[i][0]==id) {
            osh.getRange(oshsr+i,8).setValue(e.value).setNumberFormat("MM/dd/yyyy");//you can change the format here
            osh.getRange(oshsr+i,5).setValue("FALSE");
            osh.getRange(oshsr+i,6).setValue("");
            osh.getRange(oshsr+i,7).setValue("");
            break;
          }
        }
      }
    }
    
    function isDate(date){
      return(Object.prototype.toString.call(date) === '[object Date]');
    }
    

    它正在工作。我测试过了。

    你可以用这个来测试它:

    function runTwo() {
      const ss=SpreadsheetApp.getActive();
      const sh=ss.getSheetByName("Internal Audit Register");
      const e={};
      e.range=sh.getRange('G1');
      e.value=new Date();
      e.source=ss;
      e.range.columnStart=7;
      onMyEdit(e);
    }
    

    您可以使用这些创建触发器:

    function createOnMyEditTrigger() {
      createOnEditTriggerForSpreadsheet('onMyEdit');
    }
    
    function createOnEditTriggerForSpreadsheet(funcname) {
      var ssid=SpreadsheetApp.getActive().getId();
      if(!isTrigger(funcname)) {
        ScriptApp.newTrigger(funcname).forSpreadsheet(ssid).onEdit().create();
      }   
    }
    

    或者你可以通过正确使用它来测试它。

    【讨论】:

    • 感谢您的帮助。不确定我是否添加了代码并正确触发,因为它不起作用。你介意看看我在共享电子表格中做了什么吗?
    • 您是否创建了可安装的触发器
    • 是的 - 我将代码作为单独的函数添加到我的脚本中,即在我当前的 onEdit(e) 函数之外。我使用 onMyEdit 添加了触发器,并将事件设为“来自电子表格 - 编辑时”。如果您愿意,我可以将电子表格分享到您的电子邮件中。
    • 尝试添加我在脚本中显示的 e.source.toast()。让我看看哪个显示哪个不显示。
    • 在 const sh=e.range.getSheet(); 处出错;说无法读取属性“范围”
    猜你喜欢
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多