从一个电子表格提交、搜索和更新到另一个电子表格 (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_A
的 UserForm
的值复制到 WB-Datasheet 2
的 DataSheet
。
- 您想将
UserForm
sheet 的单元格 C3,C7,C8,D8,D6,D4,E8,E19,E20,E21,E22
和 B10: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 不同时,此脚本可能无法使用。请注意这一点。
参考文献:
将用户表单(选定的单元格)中的值提交到另一个 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_A
的UserForm
的值复制到WB-Datasheet 2
的DataSheet
。 - 您想将
UserForm
sheet 的单元格C3,C7,C8,D8,D6,D4,E8,E19,E20,E21,E22
和B10: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 不同时,此脚本可能无法使用。请注意这一点。