2016-10-03 7 views
1

У меня есть сценарий, который сохраняет данные с одного листа. Я вызываю «формы» на другой лист, который я называю «записями». Функция запускается, когда я нажимаю изображение, установленное в качестве кнопки в книге.перезаписывать/редактировать конкретные записи на существующем листе с помощью vlookup в диалоговом окне сохранения

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 

Таким образом, вы видите, что нужно найти способ, чтобы сценарий сделать ВПР и найти студента 2, так что можно написать новые данные по той же строке, и я не знаю, как заставить скрипт писать в эту строку, а не добавлять новую.

Надеюсь, это имеет смысл. Я не часто программирую, поэтому я не уверен, что правильно формулирую это, я искал решения, но я, возможно, искал в неправильных областях свои ограниченные знания и опыт. Если это требует разъяснений, пожалуйста, не стесняйтесь спрашивать.

Вот ссылка на фиктивный лист с полным скриптом. https://docs.google.com/spreadsheets/d/1J2rCtSmt_BM6CozO4EBdlj1YL2wtoW4D4gNCsbalO5M/edit?usp=sharing

ответ

0

Переключите оператор строки добавления для ниже, он увидит, может ли он найти имя в первом столбце листа записей, перезаписать, если это произойдет, и добавить в противном случае.

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]); 
+0

Блестящий! Спасибо! – Giantbean

0
function SaveEWSReport() { 
//Save and clear the form 
    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()); //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); 
    var flag = 0; 
    for(var i = 0; i < recordData.length; i++) 
    { 
    if(recordData[i][0] == val[0][0]) 
    { 
     flag = 1; 
     break; 
    } 
    } 

    if(flag == 1) 
    { 
    for(var i = 0; i < recordData.length; i++) 
    { 
     if(recordData[i][0] == val[0][0]) 
     { 
     for(var j = 1; j <= 12; j++) 
     { 
      recordSheet.getRange(i+1, j).setValue(val[0][j]); 
     } 
     } 
    } 
    } 

    else 
    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. 
} 

Таким образом, вы можете также использовать просто для петли для поиска определенного значения ячейки, в частности, лист.

+0

Спасибо. Это очень помогает. Сегодня я воспользуюсь решением г-на Гертенбаха, но это хорошая информация. – Giantbean

+0

Добро пожаловать! –