javascript - 将一行从一个 Google 表格电子表格复制到另一个表格提交

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

我已经阅读了很多其他帖子并尝试了一些东西,但我还没有找到解决方案。

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

这些 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);
   }
  }

最佳答案

我没有测试这段代码,但我认为它很接近。这很简单。只需将它与 onFormSubmit 绑定(bind),它将获得最后一个条目。我假设所有电子表格都已创建并且它们有一个 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 进入快速,这种方法可能无法跟上并可能得到错误的数据。我会考虑添加另一个称为 Copied 的列,然后遍历所有行并复制 Copied Column 中没有 TimeStamp 的行。循环版本是下面的代码。

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"));
      }
    }
  }
}

关于javascript - 将一行从一个 Google 表格电子表格复制到另一个表格提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44788470/

相关文章:

javascript - 使用 AJAX 更改 innerHTML 后,页面中的 HTML 恢复为原始 HTML

php - 将 HTML 表单提交插入 MySQL 表(使用 PDO)

google-apps-script - Apps 脚本 - 将 JSON 正确导出到 Google Sheet

javascript - Google 脚本 : Request failed for https://www. .. 返回代码 416。服务器被 chop

google-apps-script - 如何删除 GMail 标签 - Google Apps 脚本

javascript - 正确使用 for 循环和 promises

javascript - 将我的图片放在轮播旁边

javascript - 为什么当我使用退格键或后退按钮时我的页面会跳回到顶部

javascript - 为什么 HTML/JavaScript 小部件没有显示在我的 blogspot 中?

jQuery jPicker 完全重置