从一个电子表格提交、搜索和更新到另一个电子表格 (ID)

Submit, Search, and Update from one spreadsheet to another spreadsheet (ID)

将用户表单(选定的单元格)中的值提交到另一个 google 传播sheet,然后找到它们(搜索),修改并再次 post 它。 我有一个源 sheet(用户表单),我需要从选定的单元格和范围中获取值,使用 ID 将值提交到目标 sheet(另一个传播sheet)。

我附上了一张截图,用颜色代码解释了数据应该放在哪里。 https://i.stack.imgur.com/Yrfje.jpg [屏幕截图][1]

还分享了两个带有实际数据(Userform 和 Datasheet)的 spreadsheet 供您参考 https://docs.google.com/spreadsheets/d/1NY_ckzEWxU7DCGro5tTqzpiOi6iG5PAQFxpZg0OKodY/edit?usp=sharing

https://docs.google.com/spreadsheets/d/1QL0jaNts2YRkZTlxmS0bk7V1fVVHBsJFmxS5C05PEmA/edit?usp=sharing

请帮助增强下面的代码(感谢@[Yuri Khristich][2])

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var form_sheet = ss.getSheetByName('UserForm');
  
  var data1 = form_sheet.getRange(['c3:c8']).getValues().flat();
  var [num, date, name, id, project,group] = data1;

  var data2 = form_sheet.getRange('b10:e20').getValues();

  var data_sheet = ss.getSheetByName('DataSheet');
  var nums = data_sheet.getRange('a:a').getValues().flat();
  var row = nums.indexOf(num);

  if (row < 0 ) {
    var new_row = [num, date, name, id, project, group, JSON.stringify(data2)];
    data_sheet.appendRow(new_row)
  } else {
    var range = data_sheet.getRange('g' + ++row);
    range.setValue(JSON.stringify(data2));
        
  }
}

function searchRecord() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var form_sheet = ss.getSheetByName('UserForm');
  
  var num = form_sheet.getRange('b1').getValue();
  
  var data_sheet = ss.getSheetByName('DataSheet');
  var nums = data_sheet.getRange('a:a').getValues().flat();
  var row = nums.indexOf(num);

  if (row < 0) {
    ss.toast('Nothing was found')
    return;
  }

  row++;
  var data1 = data_sheet.getRange('a' + row + ':g' + row).getValues().flat();
  var data2 = JSON.parse(data1.pop());
  form_sheet.getRange('c3:c8').clearContent().setValues(data1.map(x => [x]));
  form_sheet.getRange('b10:e20').clearContent().setValues(data2)
}

// Function to submit the data to DataSheet sheet
function oldsubmitData() {
     
  var myGooglSheet= SpreadsheetApp.getActiveSpreadsheet(); //declare a variable and set with active google sheet 
 
  var shUserForm= myGooglSheet.getSheetByName("UserForm"); //delcare a variable and set with the User Form worksheet
 
  var datasheet = myGooglSheet.getSheetByName("DataSheet"); ////delcare a variable and set with the DataSheet worksheet

var namedRanges = SpreadsheetApp.getActiveSheet().getNamedRanges();
if (namedRanges.length > 1) {
Logger.log(namedRanges[0].getName());
}
  //to create the instance of the user-interface environment to use the messagebox features

  var ui = SpreadsheetApp.getUi();
  
  // Display a dialog box with a title, message, and "Yes" and "No" buttons. The user can also
  // close the dialog by clicking the close button in its title bar.
  var response = ui.alert("Submit", 'Do you want to submit the data?',ui.ButtonSet.YES_NO);
 
  // Checking the user response and proceed with clearing the form if user selects Yes
  if (response == ui.Button.NO) 
  {return;//exit from this function
  } 
 
  //Validating the entry. If validation is true then proceed with transferring the data to DataSheet sheet
  // if (validateEntry()==true)
 {
  
    var blankRow=datasheet.getLastRow()+1; //identify the next blank row
 
    datasheet.getRange(blankRow, 1).setValue(shUserForm.getRange("C3").getValue()); //Date
    datasheet.getRange(blankRow, 2).setValue(shUserForm.getRange("C4").getValue()); //UserForm Number
    datasheet.getRange(blankRow, 3).setValue(shUserForm.getRange("C5").getValue()); //Student Name
    datasheet.getRange(blankRow, 4).setValue(shUserForm.getRange("C6").getValue()); //ID
    datasheet.getRange(blankRow, 5).setValue(shUserForm.getRange("C7").getValue()); //Project
    datasheet.getRange(blankRow, 6).setValue(shUserForm.getRange("C8").getValue()); //Group Name
    //I stuck here, get values from moving row (E,13 to 16)
     //datasheet.getRange(blankRow, 8).setValue(shUserForm.getNamedRanges("TotalPresent").getValue());// TotalPresent
    //datasheet.getRange(blankRow, 8).setValue(shUserForm.getNamedRanges("SoundRoomDay").getValue());// SoundRoomDAy
    //datasheet.getRange(blankRow, 9).setValue(shUserForm.getNamedRanges("GroupDay").getValue());// GroupDay
    //datasheet.getRange(blankRow, 10).setValue(shUserForm.getNamedRanges("TotalDays").getValue());// TotalDays

   
    // date function to update the current date and time as submittted on
    datasheet.getRange(blankRow, 12).setValue(new Date()).setNumberFormat('yyyy-mm-dd h:mm'); //Submitted On
    
    //get the email address of the person running the script and update as Submitted By
    datasheet.getRange(blankRow, 13).setValue(Session.getActiveUser().getEmail()); //Submitted By

     var ss = SpreadsheetApp.getActiveSpreadsheet();
  var form_sheet = ss.getSheetByName('UserForm');
  
  var num = form_sheet.getRange('c3').getValue();
  var data = form_sheet.getRange('b10:e20').getValues();

  var datasheet = ss.getSheetByName('DataSheet');
  var nums = datasheet.getRange('a:a').getValues().flat();
  var row = nums.indexOf(num);

  if (row < 0) return;
  
  var range = datasheet.getRange('g' + ++row);
  range.setValue(JSON.stringify(data));
    ui.alert(' "New Data Saved - StudentID #' + shUserForm.getRange("C5").getValue() +' "');

        
   }
}```


-code by-----------------------


  [1]: https://i.stack.imgur.com/Yrfje.jpg
  [2]: https://whosebug.com/users/14265469/yuri-khristich

我猜你的目标如下。

  • 您想将 PRINTNOTE_AUserForm 的值复制到 WB-Datasheet 2DataSheet
  • 您想将 UserForm sheet 的单元格 C3,C7,C8,D8,D6,D4,E8,E19,E20,E21,E22B10:E18 的值复制到同一行。
  • 您想使用 UserForm sheet 的单元格 B1 的值搜索 DataSheet sheet 的“A”列,您想要将值放在同一行中。
  • 您想使用 Google Apps 脚本实现此目的。

通过猜测你的问题,我提出了一个示例脚本如下。

为了从分布式单元格中检索值,在此示例脚本中,我使用了 Sheets API。

示例脚本:

在您使用此脚本之前,please enable Sheets API at Advanced Google Services

根据您的脚本,此脚本用作 PRINTNOTE_A 的 container-bound 脚本。因此,请将此脚本复制并粘贴到 PRINTNOTE_A Spreadsheet.

的脚本编辑器中
function sample() {
  const dstSpreadsheetId = "###"; // Please set the destination Spreadsheet ID (WB-DataSheet_B).
  const dstSheetName = "DataSheet";
  const srcSheetName = "UserForm";

  // Retrieve values from source sheet and create an array and search value.
  const srcSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const ranges = ["B1", "C3", "C7", "C8", "D8", "D6", "D4", "E8", "E8", "E19", "E20", "E21", "E22", "B10:E18"];
  const [search, ...values] = Sheets.Spreadsheets.Values.batchGet(srcSpreadsheet.getId(), { ranges: ranges.map(r => `'${srcSheetName}'!${r}`) }).valueRanges.flatMap(({ values, range }) => {
    if (range.includes("B10:E18")) return values.flat();
    return values[0][0];
  });

  // Put the array to the destination sheet using the search value.
  const dstSheet = SpreadsheetApp.openById(dstSpreadsheetId).getSheetByName(dstSheetName);
  const range = dstSheet.getRange("A2:A" + dstSheet.getLastRow()).createTextFinder(search).findNext();
  if (range) {
    dstSheet.getRange(range.getRow(), 2, 1, values.length).setValues([values]);
  } else {
    dstSheet.getRange(dstSheet.getLastRow() + 1, 1, 1, values.length + 1).setValues([[search, ...values]]);
  }
}
  • 根据您对 but new values are not getting submitted in the next blank row. 的回复,我更新了建议的答案。在当前脚本中,当未找到搜索值时,会将值附加到目标 sheet.

注:

  • 此示例脚本适用于您提供的 2 个 Spreadsheets。而且,我使用您提供的 Spreadsheets 测试了这个脚本。因此,当您更改 Spreadsheet 并且您的实际 Spreadsheet 与您提供的示例 Spreadsheet 不同时,此脚本可能无法使用。请注意这一点。

参考文献: