Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用GoogleSheets以单独的格式将已排序的表数据写入表_Javascript_Google Sheets - Fatal编程技术网

Javascript 使用GoogleSheets以单独的格式将已排序的表数据写入表

Javascript 使用GoogleSheets以单独的格式将已排序的表数据写入表,javascript,google-sheets,Javascript,Google Sheets,我对javascript比较陌生,对google脚本也绝对陌生 我有一个选项卡,可以输入原始数据。我有另一个选项卡,其中对数据进行排序,然后在该行旁边写上批准日期。我希望该日期反映回正确行中的第一个选项卡,并且我还希望确保它保持在第二个选项卡中的正确行上(即使在添加和排序新行之后) 附件是一个只有几行的示例表。实际上,我有更多的专栏,但它们在这里是不相关的。 我的第二个选项卡使用“图纸排序”功能。但当键入日期时,会产生错误。我打算使用onEdit()函数将日期写入第一个选项卡中的正确行,然后清除

我对javascript比较陌生,对google脚本也绝对陌生

我有一个选项卡,可以输入原始数据。我有另一个选项卡,其中对数据进行排序,然后在该行旁边写上批准日期。我希望该日期反映回正确行中的第一个选项卡,并且我还希望确保它保持在第二个选项卡中的正确行上(即使在添加和排序新行之后)

附件是一个只有几行的示例表。实际上,我有更多的专栏,但它们在这里是不相关的。 我的第二个选项卡使用“图纸排序”功能。但当键入日期时,会产生错误。我打算使用onEdit()函数将日期写入第一个选项卡中的正确行,然后清除第二个选项卡中的日期列(以避免错误并保持对齐)

”javascript
函数onEdit(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet2=ss.getSheetByName(“已释放支票”);
var sheet1=ss.getSheetByName(“日志”);
var job2=sheet2.getRange(“A2:A1000”).getValues();
var job1=sheet1.getRange(“A2:A1000”).getValues();
var draw2=sheet2.getRange(“B2:B1000”).getValues();
var draw1=sheet1.getRange(“B2:B1000”).getValues();
var inv2=sheet2.getRange(“C2:C1000”).getValues();
var inv1=sheet1.getRange(“C2:C1000”).getValues();
var dates2=sheet2.getRange(“D2:D1000”);
var dates_values=sheet2.getRange(“D2:D1000”).getValues();
var dates1=sheet1.getRange(“D2:D1000”);
var指数=[]
var to_paste=[]
对于(变量i=0;i
在以下代码中:

  • 我在“checkreleased”上使用了一个helper列,可以在其中输入日期
  • onEdit(e)脚本检测新值,在“Log”上找到等效行
  • 脚本会更新“日志”上的“日期”列,此时,“check released”上的值会自动更新
  • 然后,脚本删除helper列中的值
从“日志”匹配到“检查已发布”

从“check released”到“Log”的行匹配依赖于几个元素:

  • 没有记录具有真正唯一的标识符
  • 但是,当作业号、提款号和发票号的值转换为字符串并连接时,会生成一个唯一的值,可用于比较从“日志”到“检查已发布”的值
  • “Log”上的值在循环中进行处理,以创建一个连接值的1D数组
  • 事件对象在“check released”上提供已编辑的行;该行中的Job、Draw和Invoice值连接在一起
  • 使用Javascript方法,脚本在“Log”上“查找”与编辑行中的唯一连接值相匹配的行
  • 其他需要注意的事项:

    • 使用
      getlastRow()
    • getRange
      getValues
      分别为“Log”和“check released”运行一次
    • 为变量选择了有意义的名称以反映其用途;这有助于阅读和理解代码

    函数onEdit(e){
    // 5824330602
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var ui=SpreadsheetApp.getUi();
    var logsheet=“Log”;
    var log=ss.getSheetByName(日志表);
    var checkrsheet=“检查已发布”;
    var checkr=ss.getSheetByName(checkrsheet);
    //获取日志数据
    var-logFR=2;
    var logLR=log.getLastRow();
    var-logLC=4;
    var logRange=log.getRange(logFR,1,logLR logFR+1,logLC);
    //Logger.log(logRange.getA1Notation());//调试
    var logValues=logRange.getValues();
    //获取检查发布的数据
    var checkrRange=checkr.getRange(logFR,1,logLR logFR+1,logLC);
    //Logger.log(checkrRange.getA1Notation());
    var checkrValues=checkrRange.getValues();
    //构建uniquelogitem数组
    var logitems=[];
    
    对于(var i=0;i=logFR&&editedRow)我可以问你关于你的问题吗?1.你的问题是什么?2.你能提供关于
    它不起作用的详细信息吗?3.你能提供你期望的输出吗?当你回答@Tanaike关于“它不起作用”的问题时,如果问题是脚本失败,请将执行记录复制/粘贴到您的问题中。问题不是脚本失败,而是我认为实际的算法不正确。我希望索引包含dates2的索引,该索引与dates1应包含的相同记录相关联。然后,to_paste应在t处包含dates2的内容从索引到粘贴的索引应写入日期2。该链接指向google sheets示例。@Tedinoz有什么建议吗?谢谢!这看起来效果非常好!有没有办法只使用一列而不使用辅助列?比如如果编辑后工作表不计算,而查询保持不变。可能吗?否则,太长了,读不下去了,你描述了相关记录,粘贴内容到日期,写。回到dates2。这是对dates2的错误理解。data2的单元格A1包含一个
    排序
    函数,并输出到a、B、C和D列。如果用户直接在D列的单元格中键入日期,
    #REF!
    显示在单元格A1中,并且的所有输出单元格都变为空白。
    OneEdit
    记录新日期,但没有没有相关的信息。
    ''javascript
    function onEdit() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet2 = ss.getSheetByName("check released");
      var sheet1 = ss.getSheetByName("Log");
    
      var job2 = sheet2.getRange("A2:A1000").getValues();
      var job1 = sheet1.getRange("A2:A1000").getValues();
    
      var draw2 = sheet2.getRange("B2:B1000").getValues();
      var draw1 = sheet1.getRange("B2:B1000").getValues();
    
      var inv2 = sheet2.getRange("C2:C1000").getValues();
      var inv1 = sheet1.getRange("C2:C1000").getValues();
    
      var dates2 = sheet2.getRange("D2:D1000");
      var dates_values = sheet2.getRange("D2:D1000").getValues();
      var dates1 = sheet1.getRange("D2:D1000");
    
      var indices = []
    
      var to_paste = []
    
      for(var i = 0; i < job2.length; i++) {
        var job2_Value = job2[i][0];
        var draw2_Value = draw2[i][0];
        var inv2_Value = inv2[i][0];
        for(var j=0; j<job2.length; j++) {
          var job1_Value = job1[j][0];
          var draw1_Value = draw1[j][0];
          var inv1_Value = inv1[j][0];
          if((job2_Value != "") && (job1_Value == job2_Value) && (draw1_Value === draw2_Value) && (inv1_Value === inv2_Value)) {
            indices.push([i]); 
          }
        }
      }  
    
      for(k in indices) {
        to_paste.push([dates2[k]])
      }
    
      Logger.log(to_paste)
      dates1.setValues(to_paste)
      dates2.clearContent()
      Logger.log("Cleared on check released page")
    
    };
    '''
    
    function onEdit(e) {
      // 5824330602
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var ui = SpreadsheetApp.getUi();
      var logsheet = "Log";
      var log = ss.getSheetByName(logsheet);
      var checkrsheet = "check released";
      var checkr = ss.getSheetByName(checkrsheet);
    
    
      // get Log data
      var logFR = 2;
      var logLR = log.getLastRow();
      var logLC = 4;
      var logRange = log.getRange(logFR,1,logLR-logFR+1,logLC);
      // Logger.log(logRange.getA1Notation());// DEBUG
      var logValues = logRange.getValues();
    
    
      // get check released data
      var checkrRange = checkr.getRange(logFR,1,logLR-logFR+1,logLC);
      //Logger.log(checkrRange.getA1Notation());
      var checkrValues = checkrRange.getValues();
    
    
      // build array of uniquelogitems
      var logitems=[];
      for (var i=0; i<logValues.length; i++) {
        var logjob = logValues[i][0].toString();
        var logdraw = logValues[i][1].toString();
        var loginv = logValues[i][2].toString();
        var logid = logjob+logdraw+loginv;
        //Logger.log("DEBUG: LOG: Job= "+logjob);
        //Logger.log("DEBUG: LOG: draw= "+logdraw);
        //Logger.log("DEBUG: LOG: inv= "+loginv);
        //Logger.log("DEBUG: LOG: concat= "+logid);
        var logid = logjob+logdraw+loginv;
        logitems.push(logid);
      }
      //Logger.log(logitems); //DEBUG
    
    
      // get the event objects
      var editedRow = e.range.getRow();
      var editedCol = e.range.getColumn();
      var editedSheet = e.range.getSheet().getSheetName();
      var editedValue = e.value;
      // Logger.log("DEBUG: row = "+editedRow+", column = "+editedCol+", Sheet = "+editedSheet)
    
    
      // apply logic to test whether this edit should be processed
      // Column 5 ("E") is the helper column
      if(editedRow >= logFR && editedRow <=logLR && editedCol === 5 && editedSheet === checkrsheet){
        // the edit is in Column E (Date), between the first and last rows of data, on the "check released" sheet
        //Logger.log("DEBUG: edit is OK. edit row = "+editedRow+". Keep processing");
    
        var checkrjob = checkrValues[editedRow-2][0].toString();
        var checkrdraw = checkrValues[editedRow-2][1].toString();
        var checkrinv = checkrValues[editedRow-2][2].toString();
        var checkritem = checkrjob+checkrdraw+checkrinv;
        //Logger.log("DEBUG: Checkr: job="+checkrjob+", draw= "+checkrdraw+", inv = "+checkrinv+", Item = "+checkritem);
        var match = logitems.indexOf(checkritem);
        //Logger.log("DEBUG: Matching row = "+match);
    
        // get the existing date
        var existingdate = logValues[+match+1][3];
        var cell = log.getRange(+match+2,4);
        //Logger.log("DEBUG: the update cell = "+cell.getA1Notation())
    
    
        // date field is a date, so update new date
        cell.setValue(editedValue);
        cell.setNumberFormat('mm/dd/yy');
        e.range.clearContent();
    
        //Logger.log("DEBUG: updated date on Log")
      }
      else{
        // the edit didn't meet the rule
        //Logger.log("DEBUG: edit did NOT meet criteria. Do not proceed")
      }
    
    };