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