我有一個腳本可以將 Google 通訊錄中的所有聯系人獲取到 Google 表格中的電子表格。由于聯系人數量太多,無法在 6 分鐘執行時限內獲取,我使用腳本觸發器在一段時間后繼續匯入。
...
var contacts = ContactsApp.getContacts();
var last_index = parseInt(userProperties.getProperty('last_index'));
if(isNaN(last_index)) last_index = 0;
for(var i = last_index; i < contacts.length; i){
// register trigger if time is up
// ....
var name = contacts[i].getFullName();
sheet.appendRow([name]);
}
...
什么作業:
- 當達到時間限制時(我將其設定為 4 分鐘),觸發器會運行并繼續匯入。
什么不起作用:
- 執行鏈會在某個時刻隨機停止,導致匯入不完整。
- 即使聯系人的大小小到可以在 4 分鐘內獲取,但有時匯入的聯系人數量與contacts.length 不匹配。大多數時候它會匹配。
- 補償(1)。我制作了一個新選單,以繼續從從作業表中寫入的總行數匯出的最后一個索引中匯入。但是,以這種方式完成后,無論我要求腳本從哪個索引開始,匯入的聯系人都將從第一個索引開始。
例如:
for(var i = last_row;i<contacts.length; i){ // I've checked last_row is indeed not 0
var name = contacts[i].getFullName();
// append row
}
將產生與以下相同的結果:
for(var i = 0;i<contacts.length; i){
var name = contacts[i].getFullName();
// append row
}
無論我要求從哪個索引開始,除非它是從觸發器鏈執行的,否則它將始終從聯系人陣列的第一個索引開始。誰能告訴我這里發生了什么?我該如何解決?
uj5u.com熱心網友回復:
在您的腳本中,appendRow在回圈中使用。在這種情況下,工藝成本變高。Ref我猜這可能是您處理時間的原因。如果我對你的問題的理解是正確的,那么下面的修改如何?
從:
var contacts = ContactsApp.getContacts();
var last_index = parseInt(userProperties.getProperty('last_index'));
if(isNaN(last_index)) last_index = 0;
for(var i = last_index; i < contacts.length; i){
// register trigger if time is up
// ....
var name = contacts[i].getFullName();
sheet.appendRow([name]);
}
到:
var contacts = ContactsApp.getContacts();
var values = contacts.map(e => [e.getFullName()]);
sheet.getRange(sheet.getLastRow() 1, 1, values.length).setValues(values);
- 在此修改中,將值放入一個陣列,并使用 將陣列放入電子表格
setValues。由此,我認為這個程序可能由一次執行來運行。
另一種方法:
作為另一種方法,如何使用 People API?使用 People API 時,示例腳本如下。如果您使用此腳本,請在高級 Google 服務中啟用 People API。
function myFunction() {
var sheet = SpreadsheetApp.getActiveSheet();
var values = [];
var pageToken = "";
do {
var o1 = People.People.Connections.list("people/me", { personFields: "names", fields: "connections.names.displayName,nextPageToken", pageSize: 1000, pageToken });
if (o1.connections.length > 0) {
values.push(...o1.connections.map(e => e.names ? e.names.map(f => [f.displayName]) : [[""]]));
}
pageToken = o1.nextPageToken;
} while (pageToken);
do {
var o2 = People.OtherContacts.list({ readMask: "names", fields: "otherContacts.names.displayName,nextPageToken", pageSize: 1000, pageToken });
if (o2.otherContacts.length > 0) {
values.push(...o2.otherContacts.flatMap(e => e.names ? e.names.map(f => [f.displayName]) : [[""]]));
}
pageToken = o2.nextPageToken;
} while (pageToken);
sheet.getRange(sheet.getLastRow() 1, 1, values.length).setValues(values);
}
- 在此示例中,這些值被放置到活動作業表中。請根據您的實際情況進行修改。
參考:
- 基準測驗:使用 Google Apps 腳本讀寫電子表格
- 設定值(值)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/402614.html
標籤:
