我的代码正试图"搜索"包含两个特定文本行的行的电子表格。当在前30行中找到该行时,A1:A1的值应该替换文档中的单词。
我的问题是我无法用indexOf()
计算单词,因为它需要一个字符串而getValue()/getDisplayValue()
会产生一个对象/数组。此外,不支持js' includes()
。有人知道解决方案吗?
function myFunction1() {
var tss = DocumentApp.openById("targetspreadsheet");
var docBody = tss.getBody();
var sourcess = SpreadsheetApp.openById("source spreadsheet");
var sources = sourcess.getSheets()[0];
for (var i = 1; i = 30 ; i++){
var rowValues = sources.getRange(i, 1, 1, sources.getLastColumn()).getDisplayValues();
Logger.log(rowValues);
if (rowValues.indexOf("Word1") >= 1 && rowValues.indexOf("Word2") >= 1){
var name = sources.getRange("A1:A1").getValues();
docBody.replaceText("TextToReplace", name)}
else {continue;}
}
}
也许我在搜索时忽略了一个解决方案,但到目前为止,我发现解决方案正在运行js而不是谷歌脚本。如果是的话,我很抱歉;否则,如果你能帮助我:谢谢! 干杯
答案 0 :(得分:0)
如果您的代码无效Array IndexOf,请尝试使用
if (String(rowValues).indexOf("Word1") != -1 && String(rowValues).indexOf("Word2") -= -1)
注意我也改变了索引条件值。 String indexOf
如果您需要帮助,请告诉我。
答案 1 :(得分:0)
由于您要搜索2个特定单词的各个行,因此您可以使用Array.join()组合行中每个单词的值。例如:
rowValues[i].join(" ")
此外,不是通过循环获取每一行的值,而是可以一次获取所有30行的值,然后循环遍历它们,就像这样
var rowValues = sources.getRange(1, 1, 30, sources.getLastColumn()).getDisplayValues();
for (var i = 0; i < 30 ; i++){
Logger.log(rowValues[i].join(" "));}
优点是,开销较小。因此,更快地执行脚本和整体的良好实践。 rowValues将是一个2D数组,如下所示:
rowValues = [["Row1Col1","Row1Col2",... ,"Row1ColLast"],
["Row2Col1",...,"Row2ColLast"],
...
...
["Row30Col1",....,"Row30ColLast"]] // End of array
因此,当您执行rowValue[0].join(" ")
时,它会返回以下值
rowValue[0].join(" ") => "Row1Col1 Row1Col2 ... Row1ColLast"
这是一个字符串,可以使用indexOf()进行搜索。所以你的最终代码看起来像这样:
function myFunction1() {
var tss = DocumentApp.openById("targetspreadsheet");
var docBody = tss.getBody();
var sourcess = SpreadsheetApp.openById("source spreadsheet");
var sources = sourcess.getSheets()[0];
var name = sources.getRange("A1").getValue();
var rowValues = sources.getRange(1, 1, 30, sources.getLastColumn()).getDisplayValues();
for (var i = 0; i < 30 ; i++){
Logger.log(rowValues[i].join(" "));
if (rowValues[i].join(" ").indexOf("Word1") >= 1 && rowValues[i].join(" ").indexOf("Word2") >= 1){
Logger.log("found Text "+name)
docBody.replaceText("TextToReplace", name)
}
else {
continue;
}
}
}