【问题标题】:Copy a row from one Google Sheet Spreadsheet to Another on Form Submit在提交表单时将一行从一个 Google Sheet 电子表格复制到另一个
【发布时间】:2017-06-27 19:36:09
【问题描述】:

我一直在阅读大量其他帖子并尝试了一些事情,但我还没有找到解决方案。

我有一个可输入电子表格的 Google 表单。当有人提交时,我想根据 N (14) 列中的数据确定新行将被复制到哪里。如果是 A,则将整行复制到电子表格 A,如果是 B,则将整行复制到电子表格 B。

这些 URL 是原始 URL 的副本,以防有人需要使用它们。表格在这里:Copy of New Signage Form

function movingRows() {

var spreadsheetUrlToWatch = 'https://docs.google.com/spreadsheets/d/1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc/edit#gid=291411519';

var columnNumberToWatch = 14; // column A = 1, B = 2, etc.
var valueToWatchA = "Fusion";
var valueToWatchB = "LightSource";
var spreadsheetUrlToMoveTheRowToA = "https://docs.google.com/spreadsheets/d/1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g/edit#gid=0";
var spreadsheetUrlToMoveTheRowToB = "https://docs.google.com/spreadsheets/d/1BM7x-5STx5DsEtzRiZEq8qxVXgjPjtIZoTxxWuAk46c/edit#gid=0";

var ss = SpreadsheetApp.openByUrl(spreadsheetUrlToWatch);
var sheet = ss.getSheets()[0];
var range = sheet.getActiveCell();
var sheetNameToWatch = ss.getSheets()[0].getSheetName();
console.log(sheetNameToWatch);

if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatchA) {

  var targetSheet = SpreadsheetApp.openByUrl(spreadsheetUrlToMoveTheRowToA).getSheets()[0];
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);
}
else if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatchB) {
  var targetSheet = SpreadsheetApp.openByUrl(spreadsheetUrlToMoveTheRowToB).getSheets()[0];
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
  sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);
}

}

代码通过 google 脚本编辑器附加到表单中。 Cooper 提供的解决方案后使用的代码:

function copyToSpreadsheet()
 {
   var ss0=SpreadsheetApp.openById('1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc');
   var sht0=ss0.getSheetByName('Form Responses 1');
   var rng0=sht0.getDataRange();
   var rng0A=rng0.getValues();
   //Fusion Spreadsheet
   var ssA=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
   var shtA=ssA.getSheetByName('Sheet1');
   //LightSource Spreadsheet
   var ssB=SpreadsheetApp.openById('1BM7x-5STx5DsEtzRiZEq8qxVXgjPjtIZoTxxWuAk46c');
   var shtB=ssB.getSheetByName('Sheet1');
   var row= rng0A[rng0A.length-1];
   if(row[13]== "Fusion")
   {
     shtA.appendRow(row);
   }
   if(row[13]== "LightSource")
   {
    shtB.appendRow(row);
   }
  }

【问题讨论】:

  • 您可以使用电子表格函数 IMPORTRANGE 和 QUERY 根据 N 的值导入数据,例如 =QUERY( IMPORTRANGE("1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc", responses!A2:AZ), "Select * where Col14 Contains 'A'", 0) 请注意,我没有进入您的示例文件,并且 Col14 可能会更改为 N这个案例。您可以根据需要更改范围。唯一的问题是您无法操纵数据。再说一次,我不想操纵提交的内容,所以它对我有用。
  • @Karl_S - 我试过你的想法,就像=QUERY( IMPORTRANGE("https://docs.google.com/spreadsheets/d/1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc/edit#gid=291411519", Form Responses 1!A2:AZ), "Select * where N contains 'Fusion'", 0),但它一直给我一个公式解析错误。我对电子表格编码不是很熟悉,所以如果我做错了什么,请告诉我。谢谢!
  • IMPORTRANGE 不使用整个 URLm,只使用 ID,并且由于工作表/选项卡名称有空格,因此需要用引号引起来。试试:=QUERY( IMPORTRANGE("1q7HyUL3‌​bhd_gLEAfVJrH4strnkF‌​9_UP6uhY4Qy5A6Vc", "Form Responses 1"!A2:AZ), "Select * where N contains 'Fusion'", 0) 另请注意,您必须授予工作表权限才能导入单元格将提示您输入的数据。

标签: javascript forms google-apps-script google-sheets


【解决方案1】:

我没有测试这段代码,但我认为它很接近。这很简单。只需将其绑定到 onFormSubmit 即可获得最后一个条目。我假设所有电子表格都已经创建并且它们有一个 Sheet1。

function copyToSpreadsheet()
{
  var ss0=SpreadsheetApp.openById('1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc');
  var sht0=ss0.getSheetByName('Sheet1');
  var rng0=sht0.getDataRange();
  var rng0A=rng0.getValues();
  var ssA=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtA=ssA.getSheetByName('Sheet1');
  var ssB=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtB=ssB.getSheetByName('Sheet1');
  var row= rng0A[rng0A.length-1];
  if(row[13]==1)
  {
    shtA.appendRow(row);
  }
  if(row[13]==2)
  {
    shtB.appendRow(row);
  }
}

我确实认为,如果 onFormSubmits 快速进入,这种方法可能无法跟上并可能得到错误的数据。我会考虑添加另一列,称为已复制并遍历所有行并复制那些在已复制列中没有时间戳的行。而循环版本就是下面的代码。

function copyToSpreadsheetWithLoop()
{
  var CopiedColumn=20;//Don't really know
  var ss0=SpreadsheetApp.openById('1q7HyUL3bhd_gLEAfVJrH4strnkF9_UP6uhY4Qy5A6Vc');
  var sht0=ss0.getSheetByName('Sheet1');
  var rng0=sht0.getDataRange();
  var rng0A=rng0.getValues();
  var ssA=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtA=ssA.getSheetByName('Sheet1');
  var ssB=SpreadsheetApp.openById('1sWSSHOgdum0LtCggtM6Gz-ytmFJJjMXH9pZ0NYGMV7g');
  var shtB=ssB.getSheetByName('Sheet1');
  for(var i=1;i<rng0A.length;i++)
  {
    var row= rng0A[i];
    if(row[CopiedColumn-1])
    {
      if(row[13]==1)
      {
        shtA.appendRow(row);
        sht0.getRange(i+1,CopiedColumn).setValue(Utilities.formatDate(new Date(), "GMT-6", "dd/MM/yyyy HH:mm:ss"));
      }
      if(row[13]==2)
      {
        shtB.appendRow(row);
        sht0.getRange(i+1,CopiedColumn).setValue(Utilities.formatDate(new Date(), "GMT-6", "dd/MM/yyyy HH:mm:ss"));
      }
    }
  }
}

【讨论】:

  • 您可能会注意到我添加了另一个版本。阅读差异并做出决定。如果您有任何问题并可以分享您的电子表格,我很乐意为您提供帮助。
  • 好的,我在您的代码中添加了:var sht0=ss0.getSheetByName('Form Responses 1');if(row[13]== "LightSource") { shtA.appendRow(row); } if(row[13]== "Fusion") { shtB.appendRow(row); } } 它有效,但前提是我从表单提交内容,然后在脚本编辑器中点击运行。这是因为我打开了脚本编辑器吗?我为新表单提交设置了触发器。这是我第一次从事这样的任务。
  • 代码应该附加到电子表格还是表单本身?我注意到我可以打开表单的脚本编辑器,但它没有列出我添加到源电子表格中的那个。
  • 好的,我将代码 sn-p 添加到表单本身,现在它会自动运行。谢谢!! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2012-06-10
  • 2010-10-30
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多