将范围从一个电子表格复制到另一个电子表格

时间:2012-09-06 00:40:00

标签: google-apps-script google-sheets

我正在尝试从一个工作表(通过迭代并将用户选择的列的选择项目推送来创建数组)复制到不同电子表格中不同工作表的数组内容。

我遇到了一些关于如何将范围从一个电子表格导入另一个电子表格的问题和答案,但它们都没有对我有用(所有都返回错误“我们很抱歉,发生了服务器错误。请等一下再试一次。“)我也试过'copyTo',没有成功。

这是我目前正在使用的代码。我哪里出错了?

function copyToTrix(featureList) {

  featureList = featureList.getValues();

  var tss = SpreadsheetApp.openById("0AtX9IYFZ..."); //define active trix as target 

var ts = tss.getSheetByName("US");          //define sheet in target trix

var newRange = ts.getRange("DA12:DA25");    //define target range

 newRange.setValues(featureList);  //set values in target range to items in featureList

Browser.msgBox('copied');
}

6 个答案:

答案 0 :(得分:4)

您以一种非常危险的方式定义了目标范围,因为它仅依赖于您的决定,而不依赖于阵列内容...... 您可以使用始终有效的此方法:

var beginning_row = 12;
var beginning_col = /*what ever corresponds to 'DA' */ ;
var newRange = ts.getRange(beginning_row, beginning_col, featureList.length, featureList[0].length);    //define target range

它取数组长度的行数(实际上是它)和第一个元素长度的列数(相同的注释)......非常简单可靠; - )

另外:你给自己的答案是错的(对不起,没有个人冒犯......),因为它导致“最佳实践”章节中描述的完全相反 the doc的{{3}},我建议删除它的'回答标记'和upvote。

答案 1 :(得分:1)

我在这里使用某人,我的代码对我有用。

function CopyRange() {
 var sss = SpreadsheetApp.openById('spreadsheetid'); //replace with source ID
 var ss = sss.getSheetByName('sheetname'); //replace with source Sheet tab name
 var range = ss.getRange('A2:G50'); //assign the range you want to copy
 var data = range.getValues();

 var tss = SpreadsheetApp.openById('SpreadsheetID'); //replace with destination ID
 var ts = tss.getSheetByName('sheetname2'); //replace with destination Sheet tab name

 ts.getRange(ts.getLastRow()+1, 1,49,7).setValues(data); //you will need to define the size of the copied data see getRange()

}


这段代码正在获取范围A2:G50并复制到lastrow中的sheetname2。例如,如果sheet2的第一行是availble un row11,则此代码会将信息粘贴到Row11中。

答案 2 :(得分:0)

copyTo和setValues都有效 - 我在我的代码中使用它们。

我会找到产生错误的行 - 日志,或尝试捕获。

或添加类似的内容 - 看看它是否为您提供了一些线索

// The code below will set the values for range A1:D2 to the values in an array.
var myTable = [[1, 2, 3, 4],[5, 6, 7, 8]];
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1,1,2,4).setValues(myTable);

答案 3 :(得分:0)

我使用此功能复制文档之间的整个工作表(仅限值):

 function updateSourceToTarget(sourceID,sourceName,targetID,targetname){
  Logger.log(sourceID + ' ' + sourceName + ' ' +targetname);
var source = SpreadsheetApp.openById(sourceID).getSheetByName(sourceName);
var destination = SpreadsheetApp.openById(targetID).getSheetByName(targetname);
var sourcelastRow = source.getLastRow();
var sourcelastCol = source.getLastColumn();
var sourcedata = source.getRange(1,1,sourcelastRow,sourcelastCol).getValues();
destination.getRange(1,1,sourcelastRow,sourcelastCol).setValues(sourcedata);
}

然后我调用此函数,例如:

updateSourceToTarget('sourceID','sourceSheetName','targetID','targetSheetName'); 

在另一个文档中获取原始工作表中的数据副本。 对于小型文档非常有用,如果格式和功能不重要,则必须保持原始不受影响和非共享。

另一个方向是函数sheet.copyto(),它创建了工作表的新副本,但是您需要一些不同的垃圾处理功能。 祝你好运!

答案 4 :(得分:0)

非常简短:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.popup import Popup
from kivy.properties import StringProperty
from kivy.properties import ObjectProperty
from kivy.lang import Builder
Builder.load_string('''
#:kivy 1.11.0
<MyGrid>:
    Button:
        size_hint: 0.3, 0.2
        pos_hint_x: {'center_x': 0.5}
        text: 'open popup'
        on_release: root.openPopup()
<TestClass>
    # thisButton: thisButton
    size_hint: 0.7, 0.7
    Button:
        id: thisButton
        size_hint: 0.5, 0.5
        text: root.message
        # text: 'OK'
        on_release: root.buttonFunction()
''')

class TestClass(Popup):
    message = StringProperty('')
    buttonFunction = ObjectProperty(None)

    def closeme(self):
        self.dismiss()

    def thisOne(self):
        print('success')

class MyGrid(FloatLayout):

    def openPopup(self):
        y = TestClass(message = 'test text', buttonFunction = TestClass.closeme())
        y.open()

class DropApp(App):
    def build(self):

        return MyGrid()

if __name__ == '__main__':
    DropApp().run()

答案 5 :(得分:-2)

事实证明GAS在使用setValues()函数时遇到了问题。这不是一个完整的范围,所以我最终不得不使用setValue()。 (设定值仅允许您一次在一个单元格中操作):

var tss = SpreadsheetApp.openById("0AtX9IYFZ9KkbdHg4TUdqYVppTTU5OENpb04tWTdNbHc");
var ts = tss.getSheetByName("US");
for (var i = 0; i < featureList.length; i++) {
var position = i + 12;
ts.setActiveCell("B" + position).setValue(featureList[i]);