Google apps script 谷歌电子表格脚本:通过脚本输入单元格值时,查询(导入数据未更新)
我不熟悉脚本编写 我有一个主任务列表,可以跟踪分配给其他任务的所有项目的状态。文件链接: 还有几个其他电子表格(任务)与任务分配给的人员共享。使用公式=查询(导入……)从主文件中提取相关列……。 文件链接: 我已将脚本添加到该任务文件中,每当受让人更新H&I列中的状态或备注时,数据都会被捕获并移动到相应行和列的主控表中 面临的问题是,尽管数据正确地记录在主任务列表文件中,但不反映/不更新在任务文件中,尽管数据是从主任务列表文件中提取的。下面复制了脚本Google apps script 谷歌电子表格脚本:通过脚本输入单元格值时,查询(导入数据未更新),google-apps-script,google-sheets,Google Apps Script,Google Sheets,我不熟悉脚本编写 我有一个主任务列表,可以跟踪分配给其他任务的所有项目的状态。文件链接: 还有几个其他电子表格(任务)与任务分配给的人员共享。使用公式=查询(导入……)从主文件中提取相关列……。 文件链接: 我已将脚本添加到该任务文件中,每当受让人更新H&I列中的状态或备注时,数据都会被捕获并移动到相应行和列的主控表中 面临的问题是,尽管数据正确地记录在主任务列表文件中,但不反映/不更新在任务文件中,尽管数据是从主任务列表文件中提取的。下面复制了脚本 function onEdit() {
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' ")")
}
函数onEdit(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var SourceSheet=ss.getActiveSheet();
var firstDataRow=2;//只考虑此行上或此行下的编辑
var lastDataRow=ss.getLastRow();//只考虑此行或其上的编辑
var firstDataColumn=8;//只考虑此列上或右侧的编辑
var lastDataColumn=9;//仅考虑此列上或左侧的编辑
var SourceCell=SourceSheet.getActiveCell()//-
如果(SourceSheet.getName()!=“Sheet1”)返回;
如果(SourceCell.getRow()lastDataRow | | SourceCell.getColumn()>lastDataColumn)返回;
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\u CANCEL);
var df=电子表格应用程序openById(“1WPi_YLm3XgfTRHYrLfK_8f2tgUQE-4SpHsjU0vR1bes”);
Logger.log(df.getName());
var ds=df.getSheetByName(“任务”);
var lastRow=ds.getLastRow();
var startRow=2;
var DLastColumn=ds.getLastColumn();
var DRange=ds.getRange(1,3,最后一行startRow+1,1)//-
var numRows=DRange.getNumRows()//-
var MatchCellValues=DRange.getValues()//-
对于(var i=0;i我成功地将正确的查询公式放入单元格,但查询不会更新。在我刷新两个工作表后,它甚至不会更新。除非我手动编辑主任务表,否则任务表中的查询不会做任何事。我猜这可能是一个bug,也可能是通过设计实现的。无论哪种方式,您都可以需要尝试不同的东西
使用:
而不是:
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);
};
关于第一部分,你能建议一下,可以采取什么不同的方法吗?我已经没有什么想法了。
var cell1 = SourceSheet.getRange('A1');
var formulaString = createFormulaString();
cell.setFormula(formulaString);
};