![](/img/trans.png)
[英]copy dynamic range from one spreadsheet to another spreadsheet called with getfileid
[英]Copy a range from one spreadsheet to another
我試圖將數組的內容從一張工作表(通過迭代並推送用戶選擇的列的選擇項來創建數組)復制到不同電子表格中的另一張工作表。
我遇到了許多關於如何將范圍從一個電子表格導入到另一個電子表格的問題和答案,但沒有一個對我有用(都返回錯誤“我們很抱歉,發生服務器錯誤。請稍等一下然后再試一次。”)我也試過“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');
}
您以一種非常危險的方式定義了目標范圍,因為它僅依賴於您的決定而不是數組內容……您可以使用這種一直有效的方法:
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
它從數組長度中獲取行數(實際上就是它)和從其第一個元素的長度中獲取列數(相同的注釋)......非常簡單和可靠;-)
另外:你給自己的答案是錯誤的(抱歉,沒有個人冒犯......)因為它導致與文檔“最佳實踐”一章中描述的完全相反,我建議刪除它的“回答標記”和upvote。
我在這里使用某人的某些部分,我這段代碼對我有用。
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 並復制到最后一行中的 sheetname2 可用。 例如,如果 sheet2 有第一行可用 un row11,則此代碼會將信息粘貼到 Row11 中。
我使用此功能在文檔之間復制整個工作表(僅限值):
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()
,但是您需要一些各種垃圾處理功能。 祝你好運!
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);
非常快速和簡短:
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceData = ss.getRange('Sheet1' + '!A2:M2').getValues();
var targetSheetNextRow = ss.getSheetByName('Sheet2').getLastRow() + 1;
ss.getRange('Sheet2' + '!A' + targetSheetNextRow+':M' + targetSheetNextRow).setValues(sourceData);
事實證明,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]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.