2

これは私の最後の質問とは少し異なりますが、そのコードをこれに転送することはできません。

シート 1 には、会社名を持つ個々の連絡先があります。各個人には 1 つの名前がありますが、会社名は、シート内の個人の数に基づいて複数回表示される場合があります。そう:

Name        Company       Work Address
John Smith  ABC Company
Jim Smith   XYZ Company
Bob Smith   ABC Company

シート 2 には、職場の住所を持つ会社があります。

Company        Work Address
ABC Company    1234 Street, USA
XYZ Company    5678 Street, USA

会社の住所が個人の連絡先シートに移動するようにスクリプトを作成するにはどうすればよいですか?

配列を使用して、行/列のインデックスを検索しようとしましたが、何か不足しています。このコードは私に最も近いものですが、うまく機能させることはできません (コードの列と行の番号はサンプルと一致しません。それらは私が作業しようとしている現在の配列にすぎません):

function populateCofieldsincontact() {
  var writeSheet = sskey.getSheetByName('POCs');
  var sourceSheet = sskey.getSheetByName('Businesses');

  var writeData = writeSheet.getRange(1, 6, writeSheet.getLastRow(), 5).getValues();Logger.log(writeData)
  for (var w = 0; w < writeData.length; w++ ) {

    var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues();
    var dest = [];
    for (var i = 0; i < sourceData.length; i++ ) {
      if (writeData ==sourceData[i][0].toString().match(writeData)) {
        dest.push(sourceData[i][2]); 
      }
    }
  }
  if (dest.length > 0 ) {
      writeSheet.getRange(2,10,dest.length,1).setValue(dest.toString());
    }
}

どんな助けでも大歓迎です!

クイック更新 - setValue (何らかの理由で機能しない setValues ではない) を取得し、正しい列にアドレスを書き込むことができますが、ループで書き込むために考えることができる唯一の方法は、getLastRow を使用することでした。シートに対してそれを行う方法を知っているだけです。したがって、すべてのアドレスを正しい列に配置することになりますが、実際のデータがある場所の一番下から始まる行に書き込まれます。一番上の行に書き込み、次に下に書き込む方法がわかりません。

FINAL (願わくば) コード: @Adamのコードの 13 行[w][0]目の 2 番目の言及の隣に挿入しwriteDataましたが、いくつかのテストの後、動作しているようです。ありがとう@Adamと@Serge!!:

function populateCofieldsincontact() {
  var writeSheet = sskey.getSheetByName('POCs');
  var sourceSheet = sskey.getSheetByName('Businesses');

  var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues();
  var sourceData = sourceSheet.getRange(2, 2, sourceSheet.getLastRow(), 12).getValues();
  var dest = [];
  var temp;

  for (var w = 0; w < writeData.length; w++) {
    temp = null;
    for (var i = 0; i < sourceData.length; i++) {
      if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) {
        temp = sourceData[i][11];
        break;
      }
    }
    dest.push([temp]);
  }
  if (dest.length > 0 ) {
      writeSheet.getRange(2, 13, dest.length, 1).setValues(dest);  Logger.log(dest)
  }
}
4

2 に答える 2

4

これが期待どおりに機能するかどうかを確認してください。私の仮定が正しいことを願っています(編集: コメントに従ってタイプミスを修正) :

function populateCofieldsincontact() {
  var writeSheet = sskey.getSheetByName('POCs');
  var sourceSheet = sskey.getSheetByName('Businesses');

  var writeData = writeSheet.getRange(2, 6, writeSheet.getLastRow() - 1).getValues();
  var sourceData = sourceSheet.getRange(1, 2, sourceSheet.getLastRow(), 3).getValues();
  var dest = [];
  var temp;

  for (var w = 0; w < writeData.length; w++) {
    temp = null;
    for (var i = 0; i < sourceData.length; i++) {
      if (writeData[w][0] == sourceData[i][0].toString().match(writeData[w][0])) {
        temp = sourceData[i][2];
        break;
      }
    }
    dest.push([temp]);
  }
  if (dest.length > 0 ) {
      writeSheet.getRange(2, 10, dest.length, 1).setValues(dest);
  }
}

あなたのコードにはいくつかの問題があると思いますが、重要なメッセージ (私のような初心者が解決するのにかなりの時間がかかりました) は、getValues と setValues を使用する場合、常に 2 次元配列を扱っているということだと思います。配列の幅が 1 列しかない場合でも。したがって、ビット内の角括弧dest.push([temp])- 実際には、長さ 1 の配列を dest 配列に徐々にプッシュしています。

于 2012-11-13T06:10:34.257 に答える
0

2 つのループを使用し、最初のループの各ステップで 2 番目のループを反復する必要があります。2 番目のループで一致が見つからない場合は、最初の配列に空のアイテムをプッシュして、最初のデータ シートのデータ配置を維持する必要があります。きっと乗り越えられる…

于 2012-11-13T05:57:52.123 に答える