我是Scripting的新手。
我有一个主任务列表,其中可以跟踪分配给其他项目的所有项目的状态。文件链接:https://docs.google.com/spreadsheets/d/1WPi_YLm3XgfTRHYrLfK_8f2tgUQE-4SpHsjU0vR1bes/edit?usp=sharing
还有几个其他电子表格(任务)与分配了任务的人员共享。使用Formula = Query(Importrange ......)从主文件中提取相关列。 文件链接:https://docs.google.com/spreadsheets/d/1KBvM-P1PrLlr7z-i47_cEQF-qe9zATA4cygsggDRHxI/edit?usp=sharing
我已将脚本添加到此任务文件中,无论何时受让人更新状态或备注H列H& I,数据被捕获并移动到各个行的主表单上。柱。
问题面孔是虽然数据被正确记录在主任务列表文件中,但同样没有反映/没有在任务文件中更新,尽管数据是从主任务列表文件中提取的。脚本转载如下。
function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var SourceSheet = ss.getActiveSheet();
var firstDataRow = 2; // only take into account edits on or below this row
var lastDataRow = ss.getLastRow(); // only take into account edits on or above this row
var firstDataColumn = 8; // only take into account edits on or to the right of this column
var lastDataColumn = 9; // only take into account edits on or to the left of this column
var SourceCell = SourceSheet.getActiveCell(); //-
if (SourceSheet.getName() != "Sheet1" ) return;
if (SourceCell.getRow() < firstDataRow || SourceCell.getColumn() < firstDataColumn ||
SourceCell.getRow() > lastDataRow || SourceCell.getColumn() > lastDataColumn) return;
var SourceValue = SourceCell.getValue();
var TargetCell = SourceSheet.getActiveCell();
var SourceRow = SourceSheet.getActiveSelection().getRow();
var SourceColumn = SourceSheet.getActiveSelection().getColumn();
var InvoiceRange = SourceSheet.getRange("L"+SourceRow);
var InvoiceCell = InvoiceRange.getValue();
//Browser.msgBox(SourceValue, Browser.Buttons.OK_CANCEL);
var df = SpreadsheetApp.openById("1WPi_YLm3XgfTRHYrLfK_8f2tgUQE-4SpHsjU0vR1bes");
Logger.log(df.getName());
var ds = df.getSheetByName("Task");
var lastRow = ds.getLastRow();
var startRow = 2;
var DLastColumn = ds.getLastColumn();
var DRange = ds.getRange(1,3,lastRow-startRow+1,1); //-
var numRows = DRange.getNumRows(); //-
var MatchCellValues = DRange.getValues(); //-
for (var i=0; i <= numRows - 1; i++) {
var MatchCell = MatchCellValues[i][0];
if (MatchCell == InvoiceCell) {
// Found our match
Browser.msgBox('Data Updated', Browser.Buttons.OK_CANCEL);
//Browser.msgBox(SourceValue, Browser.Buttons.OK_CANCEL);
ds.getRange(i+1,SourceColumn).setValue(SourceValue);
//ds.getRange(i+1,DLastColumn).setValue('*');
SpreadsheetApp.flush();
break; // Done, exit loop
}
}
var SourceSheet = ss.getActiveSheet();
var cell = SourceSheet.getRange('k1')
cell.setValue('*')
TargetCell.clearContent();
SpreadsheetApp.flush();
//var cell1 = SourceSheet.getRange('A1')
//cell.setValue("=QUERY({IMPORTRANGE("https://docs.google.com/spreadsheets/d/1WPi_YLm3XgfTRHYrLfK_8f2tgUQE-4SpHsjU0vR1bes/edit#gid=0","Task!A:J")},"SELECT* WHERE Col7 = 'JOHN' ")")
}
我的第二个问题是我在脚本中收到第53行的错误消息。我打算在其他脚本中使用相同的方法在Cell A1中意外更改的情况下重写相同的内容。
先谢谢。 问候, 戴文。
答案 0 :(得分:0)
我成功地将正确的QUERY公式放入单元格,但QUERY不会更新。刷新两张纸后,它甚至无法更新。除非我手动编辑主任务表,否则任务表中的QUERY不会执行任何操作。我猜它不是一个错误,或者它是按设计方式工作的。无论哪种方式,您可能需要尝试不同的东西。
使用:
setFormula(formula)
而不是:
setValue(value)
第53行:
由于公式包含单引号和双引号的组合,因此必须使用文本公式构造公式。这是一个仅用于将公式创建为字符串的函数:
function createFormulaString() {
var theFormula = '=QUERY({IMPORTRANGE("https://docs.google.com/spreadsheets/d/1jzDLwag5tJvFbKZxZ486QfE8aeI56dsM9tpUxt-loHw/edit#gid=0';
theFormula += '","Task!A:J")},"SELECT* WHERE Col7 = ';
theFormula += "'JOHN'";
theFormula += '")';
Logger.log('theFormula: ' + theFormula);
};
您可以从主要功能调用该功能:
var cell1 = SourceSheet.getRange('A1');
var formulaString = createFormulaString();
cell.setFormula(formulaString);
};