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
Google apps script 使用vlookup on save对话框覆盖/编辑现有工作表上的特定记录_Google Apps Script_Google Sheets_Saving Data - Fatal编程技术网

Google apps script 使用vlookup on save对话框覆盖/编辑现有工作表上的特定记录

Google apps script 使用vlookup on save对话框覆盖/编辑现有工作表上的特定记录,google-apps-script,google-sheets,saving-data,Google Apps Script,Google Sheets,Saving Data,我有一个脚本,它将数据从一张我称为“表单”的表保存到另一张我称为“记录”的表。单击工作簿中作为按钮设置的图像时,该函数将运行 function SaveEWSReport() { //Save and clear the form var ss2 = SpreadsheetApp.getActive(); var source = ss2.getSheetByName('Form'); var records = ss2.getSheetByName(source.getRange(

我有一个脚本,它将数据从一张我称为“表单”的表保存到另一张我称为“记录”的表。单击工作簿中作为按钮设置的图像时,该函数将运行

function SaveEWSReport() {
//Save and clear the form
  var ss2 = SpreadsheetApp.getActive();
  var source = ss2.getSheetByName('Form');
  var records = ss2.getSheetByName(source.getRange('A1').getValues()); //get the tab to send the save data to.
  var val = source.getRange('A20:Q20').getValues(); //get the cells with information to copy (contain information concatenated form dropdown cells in B2 to P19) 
  // get values from zero indext cells and save to records. 
  // 0,0=StudentB3.0,1=GradeD2.0,2=Date.0,2=FlagC5.0,3=ReferedByD5.7,0=NotesB9:F15.3,0=TeirB5.5,0=TypeB7. Nulls leave spaces. 
  var write = [val[0][0], val[0][1],null, val[0][2], val[0][3], null, null, val[0][4], val[0][5], val[0][6], val[0][7],null];            
  records.appendRow(write);  

  //Clear the cells for the next use.
  source.getRange('D2').clearContent();
  source.getRange('B3').clearContent();
  source.getRange('B3:D3').mergeAcross(); // this merges the cell to self heal potential user error.
  source.getRange('B5').clearContent();
  source.getRange('D5').clearContent();
  source.getRange('B7').clearContent();
  source.getRange('B7:F7').mergeAcross(); // this merges the cell to self heal potential user error.
  source.getRange('B9').clearContent();
  source.getRange('B9:F15').merge(); // this merges the cell to self heal potential user error.
问题是我将数据附加到了新行

 records.appendrow(write)
但是,我希望能够在现有行上进行写操作。 例如,如果记录表上显示:

A3          B3        C3
Student 1 , Grade 6 , Note Set  
Student 2 , Grade 8 , Note set
Student 3 , Grade 8 , Note set
A7          B7        C7
我为学生2添加了一张新便条,然后保存。我希望看到相同的内容,但它会附加一行,因此看起来如下所示:

A3          B3        C3
Student 1 , Grade 6 , Note Set 
Student 2 , Grade 8 , Note set
Student 3 , Grade 8 , Note set
Student 2 , Grade 8 , Note set
A8          B8        C8
所以你看,我需要找到一种方法,让脚本做一个vlookup,找到student 2,这样它就可以在同一行上写入新数据,我不知道如何让脚本写入该行,而不是附加一个新的行

我希望这是有道理的。我不经常编程,所以我不确定我的措辞是否恰当,我已经寻找了解决方案,但我可能在错误的领域进行了搜索,因为我的知识和经验有限。如果这需要澄清,请毫不犹豫地询问


下面是一个带有完整脚本的虚拟工作表链接

切换下面的append row语句,它将查看是否可以在记录表的第一列中找到名称,如果可以,则覆盖,否则追加

var recordData = records.getRange(3, 1, records.getLastRow(), 1).getValues();
var recordPosition = recordData.map(function(row) {return row[0];}).indexOf(val[0][0]); 

if (recordPosition === -1) {
  records.appendRow(write);  
} else {
  records.getRange(3 + recordPosition, 1, 1, write.length).setValues([write]);
}
如果您根本不想追加,可以将其简化为:

var recordPosition = records
    .getRange(3, 1, records.getLastRow(), 1) 
    .getValues()
    .map(function(row) {return row[0];})
    .indexOf(val[0][0]); 

records.getRange(3 + recordPosition, 1, 1, write.length).setValues([write]);

切换下面的append row语句,它将查看是否可以在记录表的第一列中找到名称,如果可以,则覆盖,否则追加

var recordData = records.getRange(3, 1, records.getLastRow(), 1).getValues();
var recordPosition = recordData.map(function(row) {return row[0];}).indexOf(val[0][0]); 

if (recordPosition === -1) {
  records.appendRow(write);  
} else {
  records.getRange(3 + recordPosition, 1, 1, write.length).setValues([write]);
}
如果您根本不想追加,可以将其简化为:

var recordPosition = records
    .getRange(3, 1, records.getLastRow(), 1) 
    .getValues()
    .map(function(row) {return row[0];})
    .indexOf(val[0][0]); 

records.getRange(3 + recordPosition, 1, 1, write.length).setValues([write]);
函数savewsreport(){ //保存并清除表单 var ss2=SpreadsheetApp.getActive(); var formSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form')//++++ var recordSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Records')//++++ var recordData=recordSheet.getDataRange().getValues()//++++ var source=ss2.getSheetByName('Form'); var records=ss2.getSheetByName(source.getRange('A1').getValues());//获取要将保存数据发送到的选项卡。 var val=source.getRange('A20:Q20').getValues();//获取包含要复制的信息的单元格(包含从B2到P19中的下拉单元格连接的信息) //从零索引单元格中获取值并保存到记录。 //0,0=StudentB3.0,1=GradeD2.0,2=Date.0,2=FlagC5.0,3=ReferedByD5.7,0=NotesB9:F15.3,0=TeirB5.5,0=TypeB7。空值保留空格。 var write=[val[0][0],val[0][1],null,val[0][2],val[0][3],null,null,val[0][4],val[0][5],val[0][6],val[0][7],null]; //记录。追加行(写入); var标志=0; 对于(变量i=0;i函数savewsreport(){ //保存并清除表单 var ss2=SpreadsheetApp.getActive(); var formSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Form')//++++ var recordSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Records')//++++ var recordData=recordSheet.getDataRange().getValues()//++++ var source=ss2.getSheetByName('Form'); var records=ss2.getSheetByName(source.getRange('A1').getValues());//获取要将保存数据发送到的选项卡。 var val=source.getRange('A20:Q20').getValues();//获取包含要复制的信息的单元格(包含从B2到P19中的下拉单元格连接的信息) //从零索引单元格中获取值并保存到记录。 //0,0=StudentB3.0,1=GradeD2.0,2=Date.0,2=FlagC5.0,3=ReferedByD5.7,0=NotesB9:F15.3,0=TeirB5.5,0=TypeB7。空值保留空格。 var write=[val[0][0],val[0][1],null,val[0][2],val[0][3],null,null,val[0][4],val[0][5],val[0][6],val[0][7],null]; //记录。追加行(写入); var标志=0; 对于(变量i=0;ifor(var j=1;j精彩!谢谢!精彩!谢谢!这很有帮助。我今天将使用Gertenbachs先生的解决方案,但这是一个很好的信息。谢谢。这很有帮助。我今天将使用Gertenbachs先生的解决方案,但这是一个很好的信息。