从 Google 文档中的两个不同表中删除行很困难
Difficulties getting rows deleted from two different tables in Google Docs
我希望你们中的一位愿意帮助我。很快就会很明显地发现,我对 Google Apps Script(和循环,就此而言,但我正在努力学习)还很陌生。我希望我的代码不会让你畏缩。
基本上在示例文档中
(https://docs.google.com/document/d/1VPua9T1d9qQFMCuvTlIqnvmhhMoplimZar4oAemAGPM/edit?usp=sharing),我想删除所有包含工作人员 Derek 的行。从日志中它表明将是第 17 行和第 18 行(在第二个 table 中,标题为“本周日程”)和第 25-29 行(在第四个 table 中,以 Agenda/Notes).
下面的代码将 运行 正常并删除我想要的行,如果我 运行 每个循环单独(除了抛出错误 re: a child index我只是驳回)。
当我尝试 运行 将它们放在一起时,我接近了但在第一个 table 中,其中一行(在顶部 table)没有删除。我先尝试了 运行ning 第二个循环,这让情况变得更糟。如果您能提供任何帮助,我们将不胜感激。
function DeleteRows() {
var doc = DocumentApp.getActiveDocument()
var body = doc.getBody();
var tables = body.getTables();
var numRows = tables[1].getNumRows();
var numRows2 = tables[3].getNumRows();
var row;
var val;
for(row = 0; row<numRows-1; row++) {
val = tables[1].getCell(row, 1).getText
tables[1].getRow(16).removeFromParent();
var row2;
var val2;
for(row2 = 0; row2<numRows2-1; row2++) {
val2 = tables[3].getCell(row2, 1).getText();
tables[3].getRow(24).removeFromParent();
Logger.log(numRows);
}
}
}
基本上,您可以通过 'Derek' 删除所有 table 行:
function DeleteRows() {
var body = DocumentApp.getActiveDocument().getBody();
var found_element = body.findText('Derek');
while (found_element != null) {
found_element.getElement().getParent().getParent().getParent().removeFromParent();
found_element = body.findText('Derek', found_element)
}
}
它只是会找到每个 'Derek' 获取其父项的父项 { table row : { table cell : { paragraph: { text } } } }
并将其删除。
对于你的情况,它只能部分工作,因为你的 table 已经合并了单元格。如果您想找到 'Derek's 行之后的所有空行并将它们也删除,则需要更复杂的解决方案。
但是我没看懂你的剧本。为什么需要嵌套循环?如果您找到 'Derek' 代码中的任何条件在哪里?
更新
要从 table 2 中删除第 17-18 行,从 table 4 中删除第 25-29 行,您可以使用此函数:
function DeleteRows2() {
var tables = DocumentApp.getActiveDocument().getBody().getTables();
[17,18].reverse().forEach(n => tables[1].getRow(n-1).removeFromParent());
[25,26,27,28,29].reverse().forEach(n => tables[3].getRow(n-1).removeFromParent());
}
我希望你们中的一位愿意帮助我。很快就会很明显地发现,我对 Google Apps Script(和循环,就此而言,但我正在努力学习)还很陌生。我希望我的代码不会让你畏缩。
基本上在示例文档中
(https://docs.google.com/document/d/1VPua9T1d9qQFMCuvTlIqnvmhhMoplimZar4oAemAGPM/edit?usp=sharing),我想删除所有包含工作人员 Derek 的行。从日志中它表明将是第 17 行和第 18 行(在第二个 table 中,标题为“本周日程”)和第 25-29 行(在第四个 table 中,以 Agenda/Notes).
下面的代码将 运行 正常并删除我想要的行,如果我 运行 每个循环单独(除了抛出错误 re: a child index我只是驳回)。
当我尝试 运行 将它们放在一起时,我接近了但在第一个 table 中,其中一行(在顶部 table)没有删除。我先尝试了 运行ning 第二个循环,这让情况变得更糟。如果您能提供任何帮助,我们将不胜感激。
function DeleteRows() {
var doc = DocumentApp.getActiveDocument()
var body = doc.getBody();
var tables = body.getTables();
var numRows = tables[1].getNumRows();
var numRows2 = tables[3].getNumRows();
var row;
var val;
for(row = 0; row<numRows-1; row++) {
val = tables[1].getCell(row, 1).getText
tables[1].getRow(16).removeFromParent();
var row2;
var val2;
for(row2 = 0; row2<numRows2-1; row2++) {
val2 = tables[3].getCell(row2, 1).getText();
tables[3].getRow(24).removeFromParent();
Logger.log(numRows);
}
}
}
基本上,您可以通过 'Derek' 删除所有 table 行:
function DeleteRows() {
var body = DocumentApp.getActiveDocument().getBody();
var found_element = body.findText('Derek');
while (found_element != null) {
found_element.getElement().getParent().getParent().getParent().removeFromParent();
found_element = body.findText('Derek', found_element)
}
}
它只是会找到每个 'Derek' 获取其父项的父项 { table row : { table cell : { paragraph: { text } } } }
并将其删除。
对于你的情况,它只能部分工作,因为你的 table 已经合并了单元格。如果您想找到 'Derek's 行之后的所有空行并将它们也删除,则需要更复杂的解决方案。
但是我没看懂你的剧本。为什么需要嵌套循环?如果您找到 'Derek' 代码中的任何条件在哪里?
更新
要从 table 2 中删除第 17-18 行,从 table 4 中删除第 25-29 行,您可以使用此函数:
function DeleteRows2() {
var tables = DocumentApp.getActiveDocument().getBody().getTables();
[17,18].reverse().forEach(n => tables[1].getRow(n-1).removeFromParent());
[25,26,27,28,29].reverse().forEach(n => tables[3].getRow(n-1).removeFromParent());
}