javascript - 替换 Google Script Apps 中的单元格值
问题描述
我正在尝试编写一个脚本,当工作表中的单元格发生更改"Негатив отсутствует"
时,它将用 value 替换另一张工作表中单元格的值"Нерелевант"
。请帮忙,我做错了什么?
function ChangeTone(event) {
if (event.source.getActiveRange().getValue()=="Негатив отсутствует" && event.source.getActiveSheet()=="Разметка ТОП100 по суду"){
var sheet = SpreadsheetApp.getActiveSheet();
var currRow = sheet.getActiveCell().getRow();
var value = sheet.getRange(currRow, 1).getDisplayValue();
var pasteSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Тональность");
var data = pasteSheet.getDataRange().getValues();
// if(currRow > 2){
// sheet.deleteRow(currRow);
// }
for(var i = 1; i<data.length;i++){
if(data[i][1] == value){
pasteSheet.getRange((i), 2).clear({contentsOnly: true});
pasteSheet.getRange((i), 2).setValue('Нерелевант');
break;
}
};
// sheet.getActiveCell().setValue("");
}
}
解决方案
解释/问题:
问题:
您的代码有一个明显的问题,尤其是在这里:
event.source.getActiveSheet()=="Разметка ТОП100 по суду"
您正在将工作表对象与字符串进行比较,这将始终返回false
。正确的做法是:
event.source.getActiveSheet().getName()=="Разметка ТОП100 по суду"
但在这里我也尝试优化你的代码,因为它效率很低。
优化:
您没有充分利用事件对象。
SpreadsheetApp.getActiveSpreadsheet()
可以替换为e.source
。
当您只需要执行一次时,您还可以多次定义相同的变量:
event.source.getActiveSheet()
并且您var sheet = SpreadsheetApp.getActiveSheet();
可以定义一个变量来存储活动工作表对象并在需要时调用它。
最后但并非最不重要的。我不太确定你关于for
循环的逻辑,因为你没有在你的问题中提到它。
但是我看到一旦源值与粘贴表中的值匹配,您就会使用for
循环、if
语句和break
行来逃避循环。for
for
您可以使用findIndex来查找与条件匹配的值,而不是使用循环data[i][1] == value
。getDataRange()
如果您打算只使用一列,也不需要完整的,因此我也更改了该部分。
解决方案:
function onEdit(e){
const ss = e.source;
const ar = e.range;
const activeSheet = ss.getActiveSheet();
const pasteSheet = ss.getSheetByName("Тональность");
if (ar.getValue()=="Негатив отсутствует" && activeSheet.getName()=="Разметка ТОП100 по суду"){
const value = activeSheet.getRange(ar.getRow(), 1).getValue();
const data = pasteSheet.getRange('B1:B'+pasteSheet.getLastRow()).getValues().flat();
const indx = data.findIndex((element) => element == value);
if (indx>-1){
const pasteRng = pasteSheet.getRange(indx+1,2);
pasteRng.clearContent();
pasteRng.setValue('Нерелевант');
}
}
}
让我知道这是否对您有用,否则我想对其进行修改。
推荐阅读
- reactjs - ASP.NET 核心确认和迁移与 azure 问题
- javascript - React Native 中的 Realm-js 在 M1 芯片中不起作用
- dataframe - 根据第二个 Dataframe 中的出现过滤一个 Dataframe。派斯帕克。需要优雅的解决方案
- r - CleanNLP 中的 CoreNLP - 运行时错误“Expected dtype int64 for index”
- mysql - 在 kubernetes pod 上运行时使用 MySQL ECONNREFUSED 10.104.38.229:3306 的 TypeORM
- c - 如何在 C 中将 int 添加到 char
- github-actions - Github 操作 EACCES:yarn install 的权限被拒绝
- c++ - 使用 h264 将 .png 图像编码为磁盘上的文件
- android - 如何在 Android Studio Kotlin WebViewClient 或 WebView 上覆盖未找到的页面 net::ERR_ADDRESS_UNREACHABLE?
- javascript - 使用 VueShowdown 修改 Markdown 内容中的 img 源的问题