【发布时间】:2020-10-27 07:30:49
【问题描述】:
如果我当前的代码用于手动输入,当我选择一个主题、一个日期并一次最多输入 4 个学生 ID(例如 1802001、1802002、1802004)然后选择一个选项时,它只是连接使用电子邮件模式(例如@icte.bdu.ac.bd)并将其插入到之前选择的目标主题表中。
我不想再使用电子邮件模式 (@icte.bdu.ac.bd)。鉴于一批学生的所有电子邮件地址都相似(例如 1902001@ubd.ac.bd、1902002@ubd.ac.bd),我当前的代码工作正常。然而,在许多机构不提供基于学生 ID 号的电子邮件地址,通常是像 tom@ubd.ac.bd 或 james@ubd.ac.bd。
请注意,当输入到仪表板(见附图)和 StudentList 表时,学生 ID 相同,但在目标表 (HUM4105) 中不同,例如 1802001、1802003、“Roll No.:18.02. 004 Reg No.:2018.11.000027"。但是,学生的电子邮件地址在所有地方都是相同的,应该作为一个基础。实际上它是一个学生考勤系统,输入通常来自一个android应用程序。如果很少有学生错过报告出勤,然后我们进行手动输入。
我想要做的是,当我输入学生 ID 时,最多 4 个(例如 1802001, 1802003) 它实际上会插入它们对应的电子邮件 从 Google 工作表 (StudentList) 到之前选择的主题工作表 (HUM4105) 的地址。学生名单 sheet contains SID in COLUMN D and Email in Column F. Please note that Edit trigger is already there and when a certain option is selected, the following code is executed.
代码是:
function manualEntry(e){
var spreadsheet = SpreadsheetApp.getActive();
var dashboard = spreadsheet.getSheetByName("Dashboard");
var sheetName = dashboard.getRange("F5").getValue();
var mDate = dashboard.getRange("G5").getDisplayValue();
var sheetw = dashboard.getRange("A8");
var sheetw2 = dashboard.getRange("G8");
if (e.range.getA1Notation() === 'K6' && e.range.getValue() === "Report 1P") {
sheetw2.setValue('Manual entry process is up and running. Please Wait!').setFontColor('Red');
onePeriodm();
sheetw.setValue('You may take class attendance now. Thank You!').setFontColor('Green');
sheetw2.setValue('You may do manual entry now. Thank You!').setFontColor('Green');
}
}
function onePeriodm(){
//for one period manual entry
const srcSheetName = "Dashboard";
// 1. Retrieve values from the source sheet.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const srcSheet = ss.getSheetByName(srcSheetName);
const [
[, , , , , emailPattern],
,
[courseCatalogId, dateString, ...studentIds],
] = srcSheet.getRange("F3:K5").getDisplayValues();
// 2. Retrieve current values
const dstSheet = ss.getSheetByName(courseCatalogId);
const dstCurrentValues = dstSheet
.getRange(`A2:C${dstSheet.getLastRow()}`) // expanded to include email column
.getDisplayValues(); // not flattening since we have multiple columns now
// 3. Convert the values for putting to the destination sheet.
// Do not include if there is already an email for this date in current values
const dstValues = studentIds.reduce((array, studentId) => {
const existingEntry = dstCurrentValues.find(
(row) => row[0] === dateString && row[2] === studentId + emailPattern
);
if (studentId != "" && !existingEntry)
array.push([
dateString,
Number(studentId),
studentId + emailPattern,
,
,
courseCatalogId,
]);
return array;
}, []);
// 4. Put the converted values to the destination sheet.
const index = dstCurrentValues.map((row) => row[0]).lastIndexOf(dateString);
const row = index + 2;
if (dstValues.length > 0){
dstSheet.insertRowsAfter(row, dstValues.length);
dstSheet.getRange(row + 1, 1, dstValues.length, dstValues[0].length).setValues(dstValues);
}
【问题讨论】:
标签: google-apps-script google-sheets