javascript - 为 google sheet 项目的 java 脚本代码的变量索引当前列
问题描述
我刚刚开始学习 javascript,我正在尝试做这样的事情:
我有 2 张不同的工作表,Sheet1 有一些数据,而 Sheet2 是空的。Sheet1 在 A 列中有数字,在其他列中有一些东西。
我试图制作一个脚本,当我在 Sheet2 的 A 列上输入一个整数(该数字在该工作表中必须是唯一的并且出现在 Sheet1 的 A 列上)并且它等于 Sheet1 的 A 列的数量时运行该脚本必须将 Sheet1 的相应行复制到 Sheet2。
我所做的是这样的:
function votazioni() {
var spreadsheet = SpreadsheetApp.getActive();
var activeSheet= spreadsheet.getActiveSheet();
var baseDati= spreadsheet.getSheetByName("Foglio2");
var cellRange = activeSheet.getActiveCell();
var imput= activeSheet.getActiveCell().getValue();
var indiceImput= cellRange.getColumn();
var copiaDati=baseDati.getActiveRange(1,indiceImput).getValue();
for (var i=1; i<1204; i++){
if (imput == copiaDati) {
for( var j=2; j<7; j++){
var copiaValore=baseDati.getRange (j,indiceImput).getValue();
activeSheet.getRange(j,indiceImput).setValue(copiaValore);
}
i=1204;
}
}
}
例如,如果我在 Sheet2 的 A2 上键入 45,则 B2 应该是 Paperino,C2 应该是 3,D2 应该是 agafdh
抱歉英语不好,提前谢谢你。
解决方案
我相信你的目标如下。
- 当
45
放入“Sheet2”的单元格“A2”时,您想45
从“Sheet1”的“A”列中搜索 的值,并将搜索到的行复制到“Sheet2”。 - 您想使用 Google Apps 脚本来实现这一点。
修改点:
- 在您的脚本中,
imput
并copiaDati
进行了比较。但似乎没有扫描“Sheet1”的“A”列。 - 在这种情况下,我认为 OnEdit 触发器可能适合实现您的目标。使用 OnEdit 触发器时,当编辑“Sheet2”的“A”列时,可以自动运行脚本。我认为这种情况可能对您的情况有用。
以上几点反映到一个脚本,它变成如下。
示例脚本:
请将以下脚本复制并粘贴到 Google 电子表格的脚本编辑器中。并且,请编辑“Sheet2”的“A”栏。这样,脚本运行,从“Sheet1”的“A”列中搜索看跌值并将该行复制到“Sheet2”。
function onEdit(e) {
const range = e.range;
const sheet = range.getSheet();
if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return;
const value = range.getValue();
const srcSheet = e.source.getSheetByName("Sheet1");
const srcRange = srcSheet.getRange("A2:A" + srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext();
if (srcRange) {
srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1));
}
}
在此示例脚本中,根据您的问题,使用了“Sheet1”和“Sheet2”的工作表名称。因此,如果您的实际情况与它们不同,请修改它们。
该脚本的流程如下。
- 检查“Sheet2”的“A”列是否被编辑。
- 编辑“Sheet2”的“A”列时,检索编辑后的值。
- 从“Sheet1”的“A”列中搜索编辑值。在这种情况下,使用 TextFinder。
- 将行从“Sheet1”复制到“Sheet2”。
笔记:
在这个脚本中,为了达到你的目的,使用了简单触发器的 OnEdit 触发器。所以当你直接运行
onEdit
脚本编辑器的函数时,会出现错误。请注意这一点。运行脚本时,请编辑“Sheet2”的“A”列。当您想手动将脚本运行到活动单元格时,您还可以使用以下脚本。在这种情况下,您可以在脚本编辑器中运行脚本。
function myFunction() { const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getActiveSheet(); const range = sheet.getActiveCell(); if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return; const value = range.getValue(); const srcSheet = ss.getSheetByName("Sheet1"); const srcRange = srcSheet.getRange("A2:A" + srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext(); if (srcRange) { srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1)); } }
参考:
添加:
关于您的附加问题如下。
是否可以避免在 Sheet2 的 A 列上出现双值?
示例脚本如下。
示例脚本:
在这种情况下,onEdit
被修改。当您使用这个脚本时,请在“Sheet2”的“A”列中输入一个值。在这种情况下,当“Sheet2”的“A”列中存在看跌值时,将删除看跌值。另一方面,当“Sheet2”的“A”列中不存在看跌值时,从“Sheet1”的“A”列中搜索看跌值并复制该行。
function onEdit(e) {
const range = e.range;
const sheet = range.getSheet();
if (sheet.getSheetName() != "Sheet2" || range.getColumn() != 1 || range.getRow() == 1) return;
const value = range.getValue();
const values = sheet.getRange("A2:A" + sheet.getLastRow()).getValues();
values.splice(range.getRow() - 2, 1);
if (values.flat().includes(value)) {
range.clearContent();
return;
}
const srcSheet = e.source.getSheetByName("Sheet1");
const srcRange = srcSheet.getRange("A2:A" + srcSheet.getLastRow()).createTextFinder(value).matchEntireCell(true).findNext();
if (srcRange) {
srcRange.offset(0, 1, 1, srcSheet.getLastColumn() - 1).copyTo(range.offset(0, 1));
}
}
- 当值存在时,如果您不想删除“Sheet2”上的看跌值,请删除
range.clearContent();
.
推荐阅读
- angular - 反应形式动态表单验证中的角度6“ExpressionChangedAfterItHasBeenCheckedError”添加和删除
- node.js - 如何使用 bitgo 发送 xrp 令牌
- javascript - Salesforce 使用用户代理 OAuth 流和商店访问令牌从另一个组织闪电验证一个组织
- python - 使用 vim、shell 或 python 移动小数点
- php - Composer.lock 与生产服务器上实际安装的软件包版本不兼容
- css - 使用 CSS 折叠响应式表格中的多个列
- gitlab - Gitlab-runner 无法使用 ssh-agent 初始化子模块
- json - 在 Java 中使用 TestNG 从 JSON 读取测试数据
- jquery - pageLength 仅在首页工作 - DataTable
- c# - 为什么网络摄像头在一段时间后冻结