【发布时间】:2019-05-09 19:38:12
【问题描述】:
我很新,我正在尝试创建一个时间/超时表。我有 2 个单独的工作表,第一个(ACTIVE)是触发启动 onEdit(e) 脚本的地方。从 onEdit(e) 开始的所有函数都会影响第二张表 (PASSIVE) 以填写 A(姓氏)、B(名字)、C(位置)、D(超时)列。我通过获取 A、B、C + 活动行的值(这不是代码)完成了超时功能。触发器始终与被复制的值位于同一行,因此相对简单。在 PASSIVE 表上,我使用某人制作的名为 addRecord 的代码存储了所有值,其中它获取 PASSIVE 表的最后一行 + 1 并安装从 ACTIVE 表中抓取的值并将它们插入。因此它添加记录而不覆盖任何内容.工作精美。然而,制作“时间”功能一直很困难。 E(Time In) 我的想法是通过在 PASSIVE!A 中搜索从 (ACTIVE!A + Active Row) 获取的值来获取 PASSIVE 表的 getRow,一旦找到匹配项,它就会查看 (PASSIVE!E + 匹配的行)是空的。如果是,它会添加 new.Date 并完成。如果它不为空,它将忽略该行并继续向下搜索具有 PASSIVE!A 与抓取值匹配的下一行。一旦它找到这个 Row,getRow。 setValue of (PASSIVE!E + 抓取行, new Date())
我确实在网上找到了一个函数来查找匹配 ACTIVE!A 和 PASSIVE!A 的第一行。但它一直在覆盖第一场比赛的日期。它从不忽略具有非空单元格的行到下一个匹配行。也许我只是有点偏离,这就是为什么我要求在答案中提供很多细节和解释。 这是我从另一个答案中使用的代码。
function getCurrentRow() {
var currentRow = SpreadsheetApp.getActiveSheet().getActiveSelection().getRowIndex();
return currentRow;
}
function onSearch1()
{
我添加了什么
var row = getCurrentRow();
var activeLocation = getValue('ACTIVE!A' + row);
继续其他代码
var searchString = activeLocation;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PASSIVE");
var column =1; //column Index
var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); //1st is header row
var searchResult = columnValues.findIndex(searchString); //Row Index - 2
我添加了什么
setValue(PASSIVE!E + searchResult, new Date().toLocaleString())
如果每个人都有不同的名字,它会起作用,但搜索结果总是找到匹配的第一行,我尝试添加一个 if ACTIVE!A == PASSIVE!A && PASSIVE!E =="", grabRow (我知道这不是正确的代码)但我什至不知道将这个 if 函数放在哪里,或者它是否可以工作,或者它是否会在运行后继续出现错误第一次真的。
继续其他代码
if(searchResult != -1)
{
//searchResult + 2 is row index.
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PASSIVE").setActiveRange(sheet.getRange(searchResult + 2, 1))
}
if(searchResult = searchResult2) {
setValue('PASSIVE!E' + searchResult, new Date().toLocaleString())
}
}
Array.prototype.findIndex = function(search){
if(search == "") return false;
for (var i=0; i<this.length; i++)
if(this[i] == search) return i;
return -1;
}
所以这是我使用的,但不确定这是否是正确的方法。每次我使用它时,它只会将 SearchResult 设置为它发现的第一行,如果它找到最后一行,我实际上更喜欢 searchString,考虑到添加记录会随着时间的推移而下降并且登录应该是最新的姓名。但我猜如果我能获得一个搜索范围并在特定列中找到两个值的行的函数,那么我可以setValue('PASSIVE!E' + foundRow, new Date().toLocaleString())
编辑 2019 年 5 月 9 日 17:34 PST 谢谢那些回答。我正在扩展这个问题。
function rowWhereTwoColumnsEqual(value1,col1,value2,col2) {
var value1=value1 || 'A1';//testing
var value2=value2 || "";
我的想法是在另一张纸的 Column1 中搜索,比如“SheetA1”(第一张纸)。以及另一张纸的 Column3 为“”(cellisempty)。
var value1= 'Sheet1!A1';
var value2= "";
var col1='Sheet2!A';
var col2='Sheet2!C';
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet2');
var rg=sh.getDataRange();
var vA=rg.getValues();
但是,我不知道 vA 是如何工作的。我还想获取找到的行的 getRow() 以便在另一个函数中使用该数字。
【问题讨论】:
标签: google-apps-script google-sheets google-apps-script-editor