Google apps script 谷歌电子表格脚本:通过脚本输入单元格值时,查询(导入数据未更新)

Google apps script 谷歌电子表格脚本:通过脚本输入单元格值时,查询(导入数据未更新),google-apps-script,google-sheets,Google Apps Script,Google Sheets,我不熟悉脚本编写 我有一个主任务列表,可以跟踪分配给其他任务的所有项目的状态。文件链接: 还有几个其他电子表格(任务)与任务分配给的人员共享。使用公式=查询(导入……)从主文件中提取相关列……。 文件链接: 我已将脚本添加到该任务文件中,每当受让人更新H&I列中的状态或备注时,数据都会被捕获并移动到相应行和列的主控表中 面临的问题是,尽管数据正确地记录在主任务列表文件中,但不反映/不更新在任务文件中,尽管数据是从主任务列表文件中提取的。下面复制了脚本 function onEdit() {

我不熟悉脚本编写

我有一个主任务列表,可以跟踪分配给其他任务的所有项目的状态。文件链接:

还有几个其他电子表格(任务)与任务分配给的人员共享。使用公式=查询(导入……)从主文件中提取相关列……。 文件链接:

我已将脚本添加到该任务文件中,每当受让人更新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' ")")
}
函数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);
};