如何解决如何避免在同一日期范围内基于列值插入数据行?
我正在将数据从用户输入插入到工作表中。在插入之前,我要确保在给定的日期范围内已经有一行具有相同的电子邮件地址(列3,代码中的值e + k3)。如果已经存在,则不会插入该行,但会处理其他输入。怎么解决呢?感谢Tanaike。
function onePeriodm(){
const srcSheetName = "Dashboard";
// 1. Retrieve values from the source sheet.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const srcSheet = ss.getSheetByName(srcSheetName);
const [[,k3],[f5,g5,...h5i5j5k5]] = srcSheet.getRange("F3:K5").getDisplayValues();
// 2. Convert the values for putting to the destination sheet.
const dstValues = h5i5j5k5.reduce((ar,e) => {
if (e != "") ar.push([g5,Number(e),e + k3,f5]);
return ar;
},[]);
// 3. Put the converted values to the destination sheet.
const dstSheet = ss.getSheetByName(f5);
const dstCurrentValues = dstSheet.getRange(`A2:A${dstSheet.getLastRow()}`).getDisplayValues().flat();
const index = dstCurrentValues.lastIndexOf(dstValues[0][0]) + 2;
dstSheet.insertRowsAfter(index,dstValues.length);
dstSheet.getRange(index + 1,1,dstValues.length,dstValues[0].length).setValues(dstValues);
}
解决方法
您需要更新reduce
函数,以便在现有数据集已包含具有输入日期和学生ID的行时,您不会生成新行。
这要求您将获取当前值的位置上移至步骤2,并扩展检索到的值以包括电子邮件列,以便可以在reduce
函数中访问这些值。由于我们正在查看多个列,因此我们现在也不能使用.flat()
技巧,但这很好,因为我们有.find()
和.map()
同样可以工作。
现在reduce
成为第3步,我们添加了需求。我们使用.find()
尝试获取具有给定日期和学生电子邮件的现有记录。 find
如果失败则返回undefined
,因此我们可以将reduce
条件更新为仅从studentId != ""
推送到studentId != "" && !existingEntry
。
由于我们更改了dstCurrentValues
的形状以扩展它并获取电子邮件值,因此我们需要将.flat()
更改为.map(row => row[0])
,以实现与lastIndexOf
相同的形状。 / p>
为了所有读者的利益,变量名称已从“ A1”表示法更新为反映其所包含值的名称。
function onePeriodm() {
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;
dstSheet.insertRowsAfter(row,dstValues.length);
dstSheet
.getRange(row + 1,1,dstValues.length,dstValues[0].length)
.setValues(dstValues);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。