google-apps-script - 根据其他行中单元格中的值有条件地编辑单元格 - 使用 Google Script 的 Google Sheet
问题描述
我对谷歌脚本的了解有限,我每天都在努力变得更好。我正在尝试根据其他行中包含的单元格中的值有条件地设置 2 个单元格的值。我有一个样本表(这里),上面有约会。您还将在输出表上看到所需的输出。
当同一个人根据他的电子邮件地址进行两个或多个约会时,我想在重复的列中为每个重复的约会写“是”,但最近的约会(基于 E 列,即约会创建的日期)并且大于当前日期(如果约会已经过去,则无需执行任何操作)。我还想将 L 列的值设置为“Not Coming”,这是一个单元格,其中包含我已经在我的主电子表格上自动化的数据验证。
这是我已经根据在 stackoverflow 上回答的其他问题设计的脚本。我不太熟悉索引以及如何处理它们。该脚本运行没有错误,但没有任何反应。
var currentDate = new Date()
// Master
var sheetMaster = ss.getSheets()[0];
var allValues=sheetMaster.getRange(2,1,sheetMaster.getLastRow()-1,sheetMaster.getLastColumn()).getValues();
var emailValues=sheetMaster.getRange(2,3,sheetMaster.getLastRow()-1,3).getValues();
var dateCreatedAtValues=sheetMaster.getRange(2,5,sheetMaster.getLastRow()-1,5).getValues();
var duplicateColumn=sheetMaster.getRange(2,11,sheetMaster.getLastRow()-1,11);
var eM=[];//emails
var dA=[];//dates
var eR=[];//entire rows
var dC=[];//duplicateColumn Yes or empty
function analyzeDuplicateEntries() {
for(var i=0;i<emailValues.length;i++) {
var idx=eM.indexOf(emailValues[i][0]);
if(idx==-1) {
eM.push(emailValues[i][0]);
dA.push(dateCreatedAtValues[i][0]);
eR.push(allValues[i]);
}
else if(new Date(dateCreatedAtValues[i][0]).valueOf() > new Date(dA[idx]).valueOf() && new Date(dateCreatedAtValues[i][0]).valueOf()> currentDate) {
duplicateColumn[i][0].setValue("Yes");
}
}
} ```
解决方案
您正在检索错误的列并将值错误地设置为范围单元格
var mailValues=sheetMaster.getRange(2,3,sheetMaster.getLastRow()-1,3).getValues();
将返回第 3 到 5 列(请参阅文档,而您的电子邮件位于 B 列,即第 2 列。
- 注意第一个参数
getRange(row, column, numRows, numColumns)
是要检索的列数,而不是最后一列 - 请注意,要
setValue
在包含多个单元格的范围内使用,您需要先使用getCell()检索相应的单元格 - 从而考虑到单元格索引以
1
(与以 0` 开头的数组索引相反)开头。
重写代码的一种简单(非最佳)方法是:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var currentDate = new Date()
// Master
var sheetMaster = ss.getSheets()[0];
var allValues=sheetMaster.getRange(2,1,sheetMaster.getLastRow()-1,sheetMaster.getLastColumn()).getValues();
var emailValues=sheetMaster.getRange(2,2,sheetMaster.getLastRow()-1,1).getValues();
var dateCreatedAtValues=sheetMaster.getRange(2,5,sheetMaster.getLastRow()-1,1).getValues();
var duplicateColumn=sheetMaster.getRange(2,11,sheetMaster.getLastRow()-1,1);
var eM=[];//emails
var dA=[];//dates
var eR=[];//entire rows
var dC=[];//duplicateColumn Yes or empty
function analyzeDuplicateEntries() {
for(var i=0;i<emailValues.length;i++) {
var idx=eM.indexOf(emailValues[i][0]);
if(idx==-1) {
eM.push(emailValues[i][0]);
dA.push(dateCreatedAtValues[i][0]);
eR.push(allValues[i]);
}
else if(new Date(dateCreatedAtValues[i][0]).valueOf() > new Date(dA[idx]).valueOf() && new Date(dateCreatedAtValues[i][0]).valueOf()> currentDate) {
duplicateColumn.getCell(i+1, 1).setValue("Yes");
}
}
}
推荐阅读
- java - 通过 id 访问以编程方式生成的 CustomView 对象
- python - 通过对每个元素的长度求和来获得列表的总长度
- ios - 在不同视图控制器之间转换后,屏幕上闪烁的线条约 1 秒
- ios - 模态表可以在 SwiftUI 中有导航栏吗?
- haskell - 如何重构 Haskell 列表 Monad 代码?
- php - 获取所有具有特定关系的模型
- php - 将自定义操作添加到 ApiPlatform 文档中的不同组
- c++ - 如何在 C++ 中使用 FindWindow 在 unicode 中搜索
- c# - 在 Hololens 1 的 2D UWP 应用程序中检测空中点击事件
- ruby-on-rails - Rails 6:Rails 未定义