Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript GoogleSheets:基于单元格值将一行数据移动到另一个工作表_Javascript_Google Sheets_Spreadsheet - Fatal编程技术网

Javascript GoogleSheets:基于单元格值将一行数据移动到另一个工作表

Javascript GoogleSheets:基于单元格值将一行数据移动到另一个工作表,javascript,google-sheets,spreadsheet,Javascript,Google Sheets,Spreadsheet,我正在尝试根据单元格值将一行数据移动到另一张工作表中。我使用了我在互联网上研究后发现的代码 /** * Moves row of data to another spreadsheet based on criteria in column 6 to sheet with same name as the value in column 4. */ function onEdit(e) { // see Sheet event objects docs // https://dev

我正在尝试根据单元格值将一行数据移动到另一张工作表中。我使用了我在互联网上研究后发现的代码

/**
 * Moves row of data to another spreadsheet based on criteria in column 6 to sheet with same name as the value in column 4.
*/
 
function onEdit(e) {
  // see Sheet event objects docs
  // https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
  var ss = e.source;
  var s = ss.getActiveSheet();
  var r = e.range;
   
  // to let you modify where the action and move columns are in the form responses sheet
  var actionCol = 6;
  var nameCol = 4;
 
  // Get the row and column of the active cell.
  var rowIndex = r.getRowIndex();
  var colIndex = r.getColumnIndex();
   
  // Get the number of columns in the active sheet.
  // -1 to drop our action/status column
  var colNumber = s.getLastColumn()-1;
   
  // if our action/status col is changed to ok do stuff
  if (e.value == "ok" && colIndex == actionCol) {
    // get our target sheet name - in this example we are using the priority column
    var targetSheet = s.getRange(rowIndex, nameCol).getValue();
    // if the sheet exists do more stuff
    if (ss.getSheetByName(targetSheet)) { 
      // set our target sheet and target range
      var targetSheet = ss.getSheetByName(targetSheet);
      var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
      // get our source range/row
      var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
      // new sheets says: 'Cannot cut from form data. Use copy instead.' 
      sourceRange.copyTo(targetRange);
      // ..but we can still delete the row after
      s.deleteRow(rowIndex);
      // or you might want to keep but note move e.g. r.setValue("moved");
    }
  }
}
此代码成功地传输同一电子表格中不同选项卡上的数据行。 但是,如果我想将数据移动到不同的电子表格中,这是行不通的。 如果要将该数据行移动到其他电子表格中,如何编辑该代码以使其也起作用

我需要一些建议! 谢谢

更新1

我创建了触发代码:

function myFunction() {
  
}
function createSpreadsheetOpenTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('myFunction')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}
所以我用更大的权限运行它

然后 第二个

/**
 * Moves row of data to another spreadsheet based on criteria in column 6 to sheet with same name as the value in column 4.
*/
 
function onEdit(e) {
  // see Sheet event objects docs
  // https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
  var ss = e.source;
  var s = ss.getActiveSheet();
  var r = e.range;
   
  // to let you modify where the action and move columns are in the form responses sheet
  var actionCol = 6;
  var nameCol = 4;
 
  // Get the row and column of the active cell.
  var rowIndex = r.getRowIndex();
  var colIndex = r.getColumnIndex();
   
  // Get the number of columns in the active sheet.
  // -1 to drop our action/status column
  var colNumber = s.getLastColumn()-1;
   
  // if our action/status col is changed to ok do stuff
  var targetss = SpreadsheetApp.openById("1S8KcrvzjvRxrABXa7A3W7QcLsCyag7DAHnWXgBjiaMc");
  if (e.value == "ok" && colIndex == actionCol) {
    // get our target sheet name - in this example we are using the priority column
    var targetSheet = s.getRange(rowIndex, nameCol).getValue();
    // if the sheet exists do more stuff
    if (ss.getSheetByName(targetSheet)) { 
      // set our target sheet and target range
      var targetSheet = targetss.getSheetByName(targetSheet);
      var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
      // get our source range/row
      var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
      // new sheets says: 'Cannot cut from form data. Use copy instead.' 
      var sourceData = sourceRange.getValues();
      targetRange.setValues(sourceData);
      // ..but we can still delete the row after
      s.deleteRow(rowIndex);
      // or you might want to keep but note move e.g. r.setValue("moved");
    }
  }
}
随着卡洛斯M

我再次运行那个和grand权限

我说的对吗

更新2

    function createSpreadsheetOpenTrigger() {
  var ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('myFunction')
      .forSpreadsheet(ss)
      .onEdit()
      .create();
}

function myFunction(e) {
  // see Sheet event objects docs
  // https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
  var ss = e.source;
  var s = ss.getActiveSheet();
  var r = e.range;
   
  // to let you modify where the action and move columns are in the form responses sheet
  var actionCol = 6;
  var nameCol = 4;
 
  // Get the row and column of the active cell.
  var rowIndex = r.getRowIndex();
  var colIndex = r.getColumnIndex();
   
  // Get the number of columns in the active sheet.
  // -1 to drop our action/status column
  var colNumber = s.getLastColumn()-1;
  // if our action/status col is changed to ok do stuff
  var targetss = SpreadsheetApp.openById("1S8KcrvzjvRxrABXa7A3W7QcLsCyag7DAHnWXgBjiaMc");
  if (e.value == "ok" && colIndex == actionCol) {
    // get our target sheet name - in this example we are using the priority column
    var targetSheet = s.getRange(rowIndex, nameCol).getValue();
    // if the sheet exists do more stuff
    if (ss.getSheetByName(targetSheet)) { 
      // set our target sheet and target range
      var targetSheet = targetss.getSheetByName(targetSheet);
      var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
      // get our source range/row
      var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
      // new sheets says: 'Cannot cut from form data. Use copy instead.' 
      var sourceData = sourceRange.getValues();
      targetRange.setValues(sourceData);
      // ..but we can still delete the row after
      s.deleteRow(rowIndex);
      // or you might want to keep but note move e.g. r.setValue("moved");
    }
  }
}
我保存并运行了它,但它不工作。我做错了什么?

更新3

这是原始的电子表格

。我想把第3行在F列中表示ok的时候转移。

这就是我希望该行数据进入的电子表格

这就是我在原版脚本编辑器中编写的脚本 电子表格

这是我在运行时单击时的日志结果

它不显示任何错误,但该行未在其他电子表格中传输。代码中是否有错误?

解决方案:
  • 您需要一个可安装的触发器来授权对两个 电子表格。您可以选中以创建此 在编辑时运行的触发器
  • 示例:

    function createSpreadsheetOpenTrigger() {
      var ss = SpreadsheetApp.getActive();
      ScriptApp.newTrigger('myFunction')
          .forSpreadsheet(ss)
          .onEdit()
          .create();
    }
    
    function myFunction(e) {
      // see Sheet event objects docs
      // https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
      var ss = e.source;
      var s = ss.getActiveSheet();
      var r = e.range;
       
      // to let you modify where the action and move columns are in the form responses sheet
      var actionCol = 6;
      var nameCol = 4;
     
      // Get the row and column of the active cell.
      var rowIndex = r.getRowIndex();
      var colIndex = r.getColumnIndex();
       
      // Get the number of columns in the active sheet.
      // -1 to drop our action/status column
      var colNumber = s.getLastColumn()-1;
      // if our action/status col is changed to ok do stuff
      var targetss = SpreadsheetApp.openById("TARGET_SS_ID_HERE");
      if (e.value == "ok" && colIndex == actionCol) {
        // get our target sheet name - in this example we are using the priority column
        var targetSheet = s.getRange(rowIndex, nameCol).getValue();
        // if the sheet exists do more stuff
        if (targetss.getSheetByName(targetSheet)) { 
          // set our target sheet and target range
          var targetSheet = targetss.getSheetByName(targetSheet);
          var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
          // get our source range/row
          var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
          // new sheets says: 'Cannot cut from form data. Use copy instead.' 
          var sourceData = sourceRange.getValues();
          targetRange.setValues(sourceData);
          // ..but we can still delete the row after
          s.deleteRow(rowIndex);
          // or you might want to keep but note move e.g. r.setValue("moved");
        }
      }
    }
    
    手动运行此函数以创建触发器

  • 使用
    SpreadsheetApp.openById()
    打开目标电子表格。然后 您可以定义类似于源电子表格的范围
  • 示例:

    function createSpreadsheetOpenTrigger() {
      var ss = SpreadsheetApp.getActive();
      ScriptApp.newTrigger('myFunction')
          .forSpreadsheet(ss)
          .onEdit()
          .create();
    }
    
    function myFunction(e) {
      // see Sheet event objects docs
      // https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
      var ss = e.source;
      var s = ss.getActiveSheet();
      var r = e.range;
       
      // to let you modify where the action and move columns are in the form responses sheet
      var actionCol = 6;
      var nameCol = 4;
     
      // Get the row and column of the active cell.
      var rowIndex = r.getRowIndex();
      var colIndex = r.getColumnIndex();
       
      // Get the number of columns in the active sheet.
      // -1 to drop our action/status column
      var colNumber = s.getLastColumn()-1;
      // if our action/status col is changed to ok do stuff
      var targetss = SpreadsheetApp.openById("TARGET_SS_ID_HERE");
      if (e.value == "ok" && colIndex == actionCol) {
        // get our target sheet name - in this example we are using the priority column
        var targetSheet = s.getRange(rowIndex, nameCol).getValue();
        // if the sheet exists do more stuff
        if (targetss.getSheetByName(targetSheet)) { 
          // set our target sheet and target range
          var targetSheet = targetss.getSheetByName(targetSheet);
          var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
          // get our source range/row
          var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
          // new sheets says: 'Cannot cut from form data. Use copy instead.' 
          var sourceData = sourceRange.getValues();
          targetRange.setValues(sourceData);
          // ..but we can still delete the row after
          s.deleteRow(rowIndex);
          // or you might want to keep but note move e.g. r.setValue("moved");
        }
      }
    }
    
    将此处的目标_SS_ID_替换为来自此链接的ID:/edit#gid=0

    样本输出:

    将“确定”设置为F列中的两行后:


    请将函数名替换为
    myFunction
    ,并将if块替换为我发布的示例代码。让我知道它是否有效。可能这只是一条浏览器消息,但您需要将电子表格上的编辑权限应用到您的google帐户,脚本才能工作。我编辑了我的答案以显示完整的代码。抱歉,我错过了这一行,应该是
    if(targetss.getSheetByName(targetSheet)){
    。我编辑了我的答案,如果有效,请立即尝试。它有效!!非常感谢您的帮助!!