Google电子表格脚本:查询(通过脚本输入单元格值时,导入范围数据未标注日期

时间:2015-03-14 10:13:32

标签: google-apps-script google-sheets

我是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中意外更改的情况下重写相同的内容。

先谢谢。 问候, 戴文。

1 个答案:

答案 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);
};