質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

1420閲覧

配列で格納したデータをスプレッドシートに書き込みたい。

ushir

総合スコア1

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2020/07/09 09:58

前提・実現したいこと

GASでスプレッドシート①にあるデータを統合、一部データは加工。
加工したデータはシート①の元データに上書きし、
更新後のデータをシート②の該当箇所に書き込みたいです。

発生している問題・エラーメッセージ

エラーが発生し、作業が完了できない状態です。

パラメータ(number[])が SpreadsheetApp.Range.setValues のメソッドのシグネチャと一致しません。

該当のソースコード

GAS

1function accountupdate() { 2 3 var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var objSheet = objSpreadsheet.getSheetByName("組織情報紐付け用"); 5 var subSheet = objSpreadsheet.getSheetByName("社員一覧"); 6 7 SpreadsheetApp.setActiveSheet(subSheet); 8 9 //「組織情報紐付け用」シートのデータをクリア 10 var clearRange = objSheet.getRange("T2:Y5000"); 11 clearRange.clearContent(); 12 13 14 //「社員一覧」シートのデータ行数取得 15 var sublastRow = subSheet.getLastRow(); 16 17 18 var now = new Date(); 19 var nowY = new Date(now.getFullYear()); 20 var Y1 = new Date(now.setFullYear(now.getFullYear() - 1)); 21 var Y3 = new Date(now.setFullYear(now.getFullYear() - 2)); 22 var Y6 = new Date(now.setFullYear(now.getFullYear() - 3)); 23 var nowM = new Date(now.setMonth(3)); 24 var nowD = new Date(now.setDate(1)); 25 26 var nowYMD = new Date(nowY, nowM.getMonth(), nowD.getDate()); 27 nowYMD = Utilities.formatDate(nowYMD,"Asia/Tokyo","yyyy/MM/dd"); 28 29 var Y1before = new Date(Y1.getFullYear(),nowM.getMonth(), nowD.getDate()); 30 Y1before = Utilities.formatDate(Y1before,"Asia/Tokyo","yyyy/MM/dd"); 31 32 var Y3before = new Date(Y3.getFullYear(),nowM.getMonth(), nowD.getDate()); 33 Y3before = Utilities.formatDate(Y3before,"Asia/Tokyo","yyyy/MM/dd"); 34 35 var Y6before = new Date(Y6.getFullYear(),nowM.getMonth(), nowD.getDate()); 36 Y6before = Utilities.formatDate(Y6before,"Asia/Tokyo","yyyy/MM/dd"); 37 38 var values = []; 39 values = subSheet.getRange('A2:V2000').getValues(); 40 41 42 for(var k = 0; k <= sublastRow-2; k++){ 43 44 var ym_s = values[k][10]; 45 var ym = new Date(ym_s); 46 ym = Utilities.formatDate(ym,"Asia/Tokyo","yyyy/MM/dd"); 47 48 49 50 //社歴振り分け 51 if(Y1before < ym && ym >= nowYMD){ 52 53 values.splice(12, 1, "入社1年目"); 54 } 55 56 else if(Y3before < ym && ym <= Y1before){ 57 58 values.splice(12, 1, "入社2~3年目"); 59 } 60 61 else if (Y6before < ym && ym <= Y3before){ 62 63 values.splice(12, 1, "入社4~6年目"); 64 } 65 66 else{ 67 68 values.splice(12, 1, "入社7年目以降"); 69 } 70 71 72 //職位名称統合 73 if(values[k][9] == "取締役" || values[k][9] == "代表取締役" || values[k][9] == "監査役"){ 74 75 values.splice(9, 1, "役員"); 76 77 } 78 79 else if(values[k][9] == "Fellow"){ 80 81 values.splice(9, 1, "Vice President"); 82 83 } 84 85 else{ 86 continue; 87 } 88 89 var lastRow = values.length; 90 var lastColumn = values[0].length; 91 92 subSheet.getRange(2,1,lastRow,lastColumn).setValues(values); 93 94 } 95 96 //「組織情報紐付け用」シートのデータ行数取得 97 var objlastRow = objSheet.getLastRow(); 98 99 for(var i = 2; i <= objlastRow; i++){ 100 101 //VLOOKUPでデータ取得 102 div = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,15,FALSE),"")'; 103 objSheet.getRange(i, 20).setFormula(div); 104 105 dept = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,16,FALSE),"")'; 106 objSheet.getRange(i, 21).setFormula(dept); 107 108 Class = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,10,FALSE),"")'; 109 objSheet.getRange(i, 22).setFormula(Class); 110 111 office = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,19,FALSE),"")'; 112 objSheet.getRange(i, 23).setFormula(office); 113 114 EmpClassification = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,9,FALSE),"")'; 115 objSheet.getRange(i, 24).setFormula(EmpClassification); 116 117 hireDate = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,11,FALSE),"")'; 118 objSheet.getRange(i, 26).setFormula(hireDate); 119 120 term = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,13,FALSE),"")'; 121 objSheet.getRange(i, 27).setFormula(term); 122 123 enSpeaker = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,21,FALSE),"")'; 124 objSheet.getRange(i, 28).setFormula(enSpeaker); 125 126 Co = '=IFERROR(VLOOKUP($A'+ i + ',社員一覧!$A$2:$V$2000,22,FALSE),"")'; 127 objSheet.getRange(i, 29).setFormula(Co); 128 129 } 130} 131

試したこと

subSheet.getRange(2,1,lastRow,lastColumn).setValues(values);
subSheet.getRange(2,1,lastRow,lastColumn).setValues([values]);に変更→変わりませんでした。

もともとは配列を使わずgetRange().setRange()にしていたのですが、
処理時間が長すぎて処理が完了せず…。

補足情報(FW/ツールのバージョンなど)

subSheet.getRange(2,1,lastRow,lastColumn).setValues(values);

を追加したことで上記エラーメッセージが表示されるようになりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問の件名は 「配列で格納したデータをスプレッドシートに書き込みたい」ですが、
コードミスは for文内の配列処理じゃないでしょうか?

検証してませんが、 values.splice の部分は 全て values[k].splice ではないかと思います。

データ範囲を小さくして ログをとる、デバッグで動かしてみる等で確認されることをお勧めします。

投稿2020/07/10 00:55

sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ushir

2020/07/12 23:55

回答ありがとうございます! ご指摘の通りfor文内の配列処理が間違っており、該当のエラーは解消することができました。 ただ、次は「Exception: データの列数が範囲の列数と一致しません。データは 22 列ですが、範囲は 23.列です。」というエラーが発生、範囲の列数を変更しても解消できず…。 自分ではどこがおかしいのか見つけられず…お手を貸していただけるとありがたいです。
sawa

2020/07/13 00:40 編集

質問文に現在のエラーが出ている修正後のコードを貼っていただけますか。(元のコードは消さずに追加で)
ushir

2020/07/19 23:57

すみません、一部修正しきれておらずエラーが出ていただけでした。 最初に指摘いただいたコードミスの修正で意図通りの挙動になること確認できました。 ありがとうございます…!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問