Apps 脚本中的 getBody 总是 returns null,尽管我认为应该这样写
getBody always returns null in Apps Script even though that's how I think it should be written
我的代码旨在使 Google 文档中的编辑更容易,但效果不佳,returns getBody 为空。我已经测试过将 "body" 设置为变量,但这不太奏效。由于我对 Javascript 缺乏经验,我很难理解为什么 exactly getBody returns null。所以,如果你知道我在这方面出了什么问题,它会对我的未来有所帮助。
function myFunction() {
var searchResult
searchResult =
DocumentApp.getActiveDocument().getBody().findText("very",searchResult)
Logger.log(searchResult)
while (searchResult !== null)searchResult.getElement().asText().setAttributes(searchResult.getStartOffset(),searchResult.getEndOffsetInclusive(),"#FF000")
searchResult =
DocumentApp.getActiveDocument().getBody().findText("very",searchResult)
}
function highlightProblem() {
var words = ["very","so","totally","really"]
words.forEach(findText)
}
function onOpen(){
DocumentApp.getUi().createMenu('everythingisnotfine.avi').addItem('Higlight Words That Make You Sound Like a Dandy', 'higlightProblem').addToUi()
}
您的正文不为空。你的第一个问题在这一行
searchResult = DocumentApp.getActiveDocument().getBody().findText("very", searchResult)
你有 findText("very", searchResult)
而你没有变量 searchResult
。根据文档,这需要 range
class(阅读 here)
接下来是整个混乱
while (searchResult !== null)
searchResult.getElement().asText()
.setAttributes(searchResult.getStartOffset(),
searchResult.getEndOffsetInclusive(),
"#FF000"
)
我做了一些格式化以便更好地查看整个 while
循环。首先,这是一个无限循环,因为它会不断重复,因为 searchResult
在循环内部永远不会改变,所以这一步要么被跳过,要么将无限继续。接下来是这个特殊的方法:
.setAttributes(searchResult.getStartOffset(),
searchResult.getEndOffsetInclusive(),
"#FF000"
)
请仔细阅读方法 here,因为您使用不当。您正在向该方法提供一个 string
,它需要一个 object
。在同一个文档页面中向下滚动到下一个方法,没有偏移量,它显示了如何格式化 attributes
的示例。
接下来我们跳出循环。这似乎毫无意义
searchResult = DocumentApp.getActiveDocument().getBody().findText("very",searchResult);
也许您的意思是在 while
循环内完成?因为本质上你现在正在做的是
- 从文档中设置
searchResult
。
- 日志
searchResult
对象
- 设置
searchResult
属性(因为这看起来像十六进制颜色代码,我假设您希望为代码着色)。在 searchResult
不是 null
时执行此操作。
- 从文档
设置searchResult
- 结束
如果这意味着在 while 循环内,那么您需要在 while
之后添加 {
并在您希望在 1 次迭代中发生的最后一个操作之后添加 }
while
循环。
我的代码旨在使 Google 文档中的编辑更容易,但效果不佳,returns getBody 为空。我已经测试过将 "body" 设置为变量,但这不太奏效。由于我对 Javascript 缺乏经验,我很难理解为什么 exactly getBody returns null。所以,如果你知道我在这方面出了什么问题,它会对我的未来有所帮助。
function myFunction() {
var searchResult
searchResult =
DocumentApp.getActiveDocument().getBody().findText("very",searchResult)
Logger.log(searchResult)
while (searchResult !== null)searchResult.getElement().asText().setAttributes(searchResult.getStartOffset(),searchResult.getEndOffsetInclusive(),"#FF000")
searchResult =
DocumentApp.getActiveDocument().getBody().findText("very",searchResult)
}
function highlightProblem() {
var words = ["very","so","totally","really"]
words.forEach(findText)
}
function onOpen(){
DocumentApp.getUi().createMenu('everythingisnotfine.avi').addItem('Higlight Words That Make You Sound Like a Dandy', 'higlightProblem').addToUi()
}
您的正文不为空。你的第一个问题在这一行
searchResult = DocumentApp.getActiveDocument().getBody().findText("very", searchResult)
你有 findText("very", searchResult)
而你没有变量 searchResult
。根据文档,这需要 range
class(阅读 here)
接下来是整个混乱
while (searchResult !== null)
searchResult.getElement().asText()
.setAttributes(searchResult.getStartOffset(),
searchResult.getEndOffsetInclusive(),
"#FF000"
)
我做了一些格式化以便更好地查看整个 while
循环。首先,这是一个无限循环,因为它会不断重复,因为 searchResult
在循环内部永远不会改变,所以这一步要么被跳过,要么将无限继续。接下来是这个特殊的方法:
.setAttributes(searchResult.getStartOffset(),
searchResult.getEndOffsetInclusive(),
"#FF000"
)
请仔细阅读方法 here,因为您使用不当。您正在向该方法提供一个 string
,它需要一个 object
。在同一个文档页面中向下滚动到下一个方法,没有偏移量,它显示了如何格式化 attributes
的示例。
接下来我们跳出循环。这似乎毫无意义
searchResult = DocumentApp.getActiveDocument().getBody().findText("very",searchResult);
也许您的意思是在 while
循环内完成?因为本质上你现在正在做的是
- 从文档中设置
searchResult
。 - 日志
searchResult
对象 - 设置
searchResult
属性(因为这看起来像十六进制颜色代码,我假设您希望为代码着色)。在searchResult
不是null
时执行此操作。 - 从文档 设置
- 结束
searchResult
如果这意味着在 while 循环内,那么您需要在 while
之后添加 {
并在您希望在 1 次迭代中发生的最后一个操作之后添加 }
while
循环。