【问题标题】:google sheets script conditionally move row to another spreadsheet谷歌表格脚本有条件地将行移动到另一个电子表格
【发布时间】:2018-05-11 02:40:37
【问题描述】:

我是新手,我在尝试解决这个问题时遇到了一些麻烦。我有一个从谷歌表单收集数据的电子表格。我正在尝试找到一种方法,将基于列答案的数据移动到不同的谷歌表格。 (不是同一个文档中的一张纸,而是一个不同的文档)。似乎有一些关于移动到同一文档中的不同选项卡的信息,但不是不同的文档。

我首先要说我只尝试了一个 IMPORTRANGE 函数,但它只镜像数据,并且不允许您更新或更改单元格。

到目前为止,这是我能够拼凑的内容,但我可能还差得很远。

我有一个每小时运行一次的触发器。

function myFunction() {
 var ss = SpreadsheetApp.openById('1U0I9SkbGkHgm-vRkwf2Ppc_yxlqrVlg2t8yKRy3sYuI');
 var sheetOrg = ss.getSheetByName("Form Responses 1");
 var value1ToWatch = "ANDERSON";
 var value2ToWatch = "BARNES";
 var sheetNameToMoveTheRowTo = "Sheet1"; //sheet has same name for each target openByID(" *url key* ")
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var ts1 =SpreadsheetApp.openById("1PxV1PQrMdu_2aSru4dpan8cUgHYdlYPUp5anyzjMAms");
     sheet1in = ts1.getSheetByName("Sheet1");
 var ts2 = SpreadsheetApp.openById("1BYyQZNiXc2QqsyqWs7uazjl5B6mfFYM1xj3u8gWyYOQ");
     sheet1in = ts2.getSheetByName("Sheet1");

 arr = [], 
values = sheetOrg.getDataRange().getValues(),
i = values.length;
while (--i) {
  if (value1ToWatch.indexOf(values[i][1]) > -1) {
    arr.unshift(values[i])
   sheetOrg.deleteRow(i + 1) 
   sheet1in.getRange(sheet1in.getLastRow()+1, 1, arr.length, 
     arr[0].length).setValues(arr); 
  };

 if (value2ToWatch.indexOf(values[i][1]) > -1) {
    arr.unshift(values[i])
   sheetOrg.deleteRow(i + 1) 
   sheet2in.getRange(sheet2in.getLastRow()+1, 1, arr.length, 
 arr[0].length).setValues(arr);
};
}
}
  1. 谷歌表单将信息转储到“表单响应 1”中。
  2. B 列是我要从中获取值的单元格。 (总共有 9 个不同的值,可以是“ANDERSON”、“BARNES”、“SMITH”等)。
  3. 对于 sheetNameToMoveTheRowTo 是“Sheet1” - 这可能会造成混淆,我可能需要更改它,但例如
    • ts1 =SpreadsheetApp.openById("1PxV1PQrMdu_2aSru4dpan8cUgHYdlYPUp5anyzjMAms") 我希望将信息移动到的工作表名称是“Sheet1”。
    • ts2 = SpreadsheetApp.openById("1BYyQZNiXc2QqsyqWs7uazjl5B6mfFYM1xj3u8gWyYOQ") 工作表名称也是“Sheet1”,但在不同的文档中。

我认为,如果我能够让“ANDERSON”工作,那么我可以为每个可能的响应添加额外的变量,只需复制和粘贴额外的“IF”语句,只需更改 valueToWatch 和 targetSheet 值。

我尝试调试和运行上面的脚本,但没有任何反应。调试没有报告错误,但它没有移动任何信息。

知道我做错了什么吗?

// 更新我得到了这个工作。我已经用对我有用的代码更新了列出的代码。

【问题讨论】:

  • 您可能需要将var sheet = SpreadsheetApp.getActiveSheet(); 更改为var sheet = ss.getSheetByName(sheetNameToWatch),因为定时触发器不能有活动工作表
  • 谢谢。所以只是为了澄清我是否使用了基于时间的触发器,我需要返回并更新所有活动工作表和活动范围引用?

标签: google-apps-script google-sheets google-sheets-api


【解决方案1】:

我认为copyTo() 方法不会像你提到的那样工作,它在同一个电子表格上运行。我将在source 表格数据上向您发送带有looping 的示例,然后使用它设置target 表格值。

function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var allrange = ss.getActiveRange();
  var range = sheet.getRange("A1:A10");
  var values = range.getValues();
  var allvals = [];
  for(var i = 0; i < values.length; i++) {
    allvals.push( values[i] ) ;
  }
  var dataLength = allvals.length;
  // alert data
  var ui = SpreadsheetApp.getUi();
  // ui.alert( JSON.stringify(allvals) )

  // copy to new Google SpreadSheet
  var newSheet = SpreadsheetApp.openById('1F79XkNPWm2cCWlB2JP3K4tAYRESKUgtHK4Pn2vbJEiI').getSheets()[0];
  var tmp = "A1:A" + dataLength ;
  var newRange = newSheet.getRange( tmp );
  newRange.setValues( allvals );
}

【讨论】:

  • 漂亮的截图。你用的是什么工具?
  • 嘿 @MaxMakhrov 它是 2 个工具的组合:SimpleScreenRecorder(仅捕获 mkv ~16fps 的视频)-> 上传到 cloudconvert.com 并将 vid 转换为 gif :)
  • 谢谢。因此,从外观上看,这将创建一个按钮,我必须手动单击以复制信息。但我正在寻找的是基于时间的触发器,以有条件地将行从一个文档移动到下一个文档,然后删除原始行。
  • 我将如何修改您在 //copy to new Google Spreadsheet 下列出的代码,以不移动所有信息,而只移动与语句匹配的行。例如条件数据所在的列是“B”,假设第 5 行匹配,我想将第 5 行(A 到 F 列)从“表单响应 1”移动到新文档,然后删除第 5 行. 会是这样吗?
  • if(sheet.getName() == "Form Responses 1" && range.getColumn() == 2 && range.getValue() == "ANDERSON") { var newSheet = SpreadsheetApp.openById ('1PxV1PQrMdu_2aSru4dpan8cUgHYdlYPUp5anyzjMAms').getSheetByName(“Sheet1”)[0]; var tmp = "A1:F" + dataLength ; var newRange = newSheet.getRange(tmp); newRange.setValues(allvals); }
【解决方案2】:

这是一个将数据从一个电子表格移动到另一个电子表格的简单示例。

function movingDataToSS(){
  var ss=SpreadsheetApp.getActive();
  var dss=SpreadsheetApp.openById('ssId');
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var dsh=dss.getSheetByName('Sheet1');
  var drg=dsh.getRange(1,1,rg.getHeight(),rg.getWidth()).setValues(vA);
}

如果您有兴趣通过仅从奇数行和偶数列获取输出来对输出设置一些条件。

function movingDataOddRowsAndEvenCols(){
  var ss=SpreadsheetApp.getActive();
  var dss=SpreadsheetApp.openById('ssId');
  var sh=ss.getActiveSheet();
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var h=rg.getHeight();
  var w=rg.getWidth();
  var dsh=dss.getSheetByName('Sheet1');
  for(var i=0;i<h;i++){
    var out=[];
    if(i%2==0){
      for(var j=0;j<w;j++){
        if(j%2==1){
          out.push(vA[i][j]);
        }
      }
      dsh.appendRow(out);
    }
  }
}

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 2011-05-29
    • 2021-10-03
    • 1970-01-01
    • 2013-01-17
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多